如何在maven-jar-plugin中指定--main-class和--module-version?

Zhe*_*lov 12 java maven java-9

如果我从命令行在Java 9上构建JAR,我将一个参数传递--main-class给包含MainClass属性module-info.class:

jar --create --file <filename> --main-class=<mainclass> --module-version 0.1 -C classes .
Run Code Online (Sandbox Code Playgroud)

但是如果我从maven构建一个JAR呢?这是我的maven-jar-plugin配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我可以通过自定义的参数maven-jar-plugin(如compilerArgsmaven-compiler-plugin)?

Zhe*_*lov 8

临时解决方法是调用jar --updatepackage阶段:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        ...
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <phase>package</phase>
            <configuration>
                <target>
                    <exec executable="${java.home}/bin/jar" failonerror="true">
                        <arg value="--main-class"/>
                        <arg value="[main class here]"/>
                        <arg value="--module-version"/>
                        <arg value="0.1"/>
                        <arg value="--update"/>
                        <arg value="--file"/>
                        <arg value="${project.build.directory}/${project.artifactId}-${project.version}.jar"/>
                    </exec>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我愿意接受更好的想法.


Itc*_*chy 7

maven-jar-plugin 版本 3.1.2+ 可以做到这一点(尚未发布,但问题已关闭):

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.2</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>[main class here]</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
Run Code Online (Sandbox Code Playgroud)

说明称

从版本 3.1.2 开始,如果 JAR 文件包含 module-info.class,此插件将使用附加属性 [...] 更新模块化描述符 (module-info.class)。添加的最显着的附加属性是模块主类。

基本上它采用添加到清单文件的值并将其添加到模块信息中。