Java 如何在jigsaw和jre 8支持下使用maven?

Java 如何在jigsaw和jre 8支持下使用maven?,java,maven,java-8,java-9,java-platform-module-system,Java,Maven,Java 8,Java 9,Java Platform Module System,我正在用maven构建一个java项目。 我想确定几件事: 构建的jar可以在jre8上运行 构建的jar可以在jre9上运行,带有module/jigsaw 构建的jar可以放在maven central上 我应该如何配置maven编译器插件? 谢谢 原始回购协议位于 现在我可以通过2和3,但是输出jar似乎不能在jre8上运行。A可以用来实现这个目的;但是,如果您只需要Jigsaw模块支持,那么使用maven编译器插件的Java 8和9的双重编译配置就足够了(如下所示) 以下是一个构建配置,

我正在用maven构建一个java项目。 我想确定几件事:

  • 构建的jar可以在jre8上运行
  • 构建的jar可以在jre9上运行,带有module/jigsaw
  • 构建的jar可以放在maven central上
  • 我应该如何配置maven编译器插件? 谢谢

    原始回购协议位于

    现在我可以通过2和3,但是输出jar似乎不能在jre8上运行。

    A可以用来实现这个目的;但是,如果您只需要Jigsaw模块支持,那么使用
    maven编译器插件的Java 8和9的双重编译配置就足够了(如下所示)

    以下是一个构建配置,它能够维护JRE 8支持,但与在JRE 9+中用作模块兼容。如有必要,可以对其进行调整,以支持最早可追溯到JRE 1.6的项目

    以下生成配置概述

    • 强制执行
      $JAVA_HOME
      JDK 9+,以便可以根据源代码编译和验证
      module info.JAVA
      (确保正确引用所有模块依赖项)
    • 默认编译
      执行更改为NO-OP。通过指定
      8
      (或
      目标
      /
      标志),Maven自动导入期间的某些IDE(使用IntelliJ测试)将假定此项目的语言级别为Java 8,并产生有关项目
      模块信息.Java
      的错误
    • 为Java9编译所有源代码(包括
      module info.java
      );这确保
      模块info.java
      包含在没有项目源的情况下使用的任何依赖项
    • 编译java 8的所有源代码(不包括
      module info.java
      ),用java 8类覆盖以前编译的所有java 9类;这意味着只有Java 9类(类级别53+)是
      module info.class
      。所有其他类现在都应该可以在兼容的JRE 8上执行
    注释

    • 需要注意的是,这将编译两次源代码,一次用于Java8,另一次用于Java9。这可能会显著增加大型项目的构建时间(但对于小型项目则可以忽略不计)。这可以通过将
      module info.java
      放在另一个源目录(例如
      src/main/java9
      )中并配置多版本JAR来解决(请参阅本消息开头的第一个链接)。请注意,为了正确导入IDE并正确标记这个额外的Java9源目录,可以使用带有
      org.codehaus.mojo:buildhelperMaven插件的NO-OP执行
    • 只有
      module info.java
      将支持java 9,所有其他类仅限于JDK/JRE 8中可用的类/方法/字段/代码
    • 如果项目配置中的某些工具不支持Java 9
      module info.class
      ,则可能需要在其中进行更新。一些旧版本的默认Maven插件没有足够的模块支持
    
    org.apache.maven.plugins
    maven enforcer插件
    3.0.0-M3
    jdk9
    执行
    [1.9,)
    编译需要JDK 9+
    org.apache.maven.plugins
    maven编译器插件
    3.8.1
    默认编译
    没有一个
    9
    java-9-module-compile
    编译
    9
    java-8-compile
    编译
    8.
    module-info.java
    
    我已经完成了。请看我的项目。您使用Java 9编译器级别编译,然后使用Java 8编译级别重新编译除module-info.Java之外的所有内容。因此,您有一个带有Java 9模块信息的Java 8 jar。您可以在GitHub上的ant xml脚本中看到编译命令

    Android studio最初的一个问题已经解决,它不会忽略模块信息。最近的Android studio版本可以,所有Java平台和环境也可以。Java 9 JRE和更高版本会识别模块信息,Java 8不会,Java 8和更早版本会忽略模块信息

    我的jar也在maven central中,因此它可以满足您的3个需求。请在您的开发环境中使用Java 8或更高版本的JRE进行测试

    多释放罐不是必需的,也不值得麻烦


    当我在研究同一个问题时,我发现这个解决方案在Apache项目中使用,所以我不是唯一一个这样做的人。

    听起来这么广泛,你可能想在maven中寻找工具链,在maven中寻找多版本jar。(在Java-8上运行jar有什么问题?@Naman异常在线程“main”中)java.lang.UnsupportedClassVersionError:com/xenoamess/cyan_potion/SDL_GameControllerDB_Util已由java运行时的最新版本(类文件版本53.0)编译,该版本仅适用于java运行时
    <build>
        <plugins>
            <!-- ensure the project is compiling with JDK 9+ -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>3.0.0-M3</version>
                <executions>
                    <execution>
                        <id>enforce-jdk9</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireJavaVersion>
                                    <version>[1.9,)</version>
                                    <message>JDK 9+ is required for compilation</message>
                                </requireJavaVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- compile sources -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <executions>
                    <!-- disable default phase due to fixed id and position in lifecycle -->
                    <execution>
                        <id>default-compile</id>
                        <phase>none</phase>
                        <!-- specify source/target for IDE integration -->
                        <configuration>
                            <release>9</release>
                        </configuration>
                    </execution>
                    <!-- compile sources with Java 9 to generate and validate module-info.java -->
                    <execution>
                        <id>java-9-module-compile</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <release>9</release>
                        </configuration>
                    </execution>
                    <!-- recompile sources as Java 8 to overwrite Java 9 class files, except module-info.java -->
                    <execution>
                        <id>java-8-compile</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <!-- specify JDK 9+ release flag to ensure no classes/methods later than Java 8 are used accidentally -->
                            <release>8</release>
                            <!-- exclude module-info.java from the compilation, as it is unsupported by Java 8 -->
                            <excludes>
                                <exclude>module-info.java</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>