如何在 maven-jar-plugin 中指定 --main-class 和 --module-version?
How to specify --main-class and --module-version in maven-jar-plugin?
如果我从命令行在 Java 9 上构建 JAR,我会传递参数 --main-class
以将 MainClass 属性包含到 module-info.class
:
jar --create --file <filename> --main-class=<mainclass> --module-version 0.1 -C classes .
但是如果我从 maven 构建一个 JAR 呢?这是我的 maven-jar-plugin
配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
我可以将自定义参数传递给 maven-jar-plugin
(例如 compilerArgs
传递给 maven-compiler-plugin
)吗?
也许你可以使用这个:
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
然后编辑 MANIFEST.MF 文件
Main-Class: classname
编辑:
我找到了这个配置
<configuration>
<archive>
<manifest>
<mainClass>com.Main</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
临时解决方法是在 package
阶段调用 jar --update
:
<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>
我乐于接受更好的想法。
这可以通过 maven-jar-plugin 3.1.2+ 版本(尚未发布,但 issue is closed)实现:
<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>
Starting with version 3.1.2, if the JAR file contains module-info.class, this plugin will update the modular descriptor (module-info.class) with additional attributes [...]. The most notable additional attribute added is the module main class.
基本上它采用添加到 Manifest 文件中的值,并将其添加到模块信息中。
如果我从命令行在 Java 9 上构建 JAR,我会传递参数 --main-class
以将 MainClass 属性包含到 module-info.class
:
jar --create --file <filename> --main-class=<mainclass> --module-version 0.1 -C classes .
但是如果我从 maven 构建一个 JAR 呢?这是我的 maven-jar-plugin
配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
我可以将自定义参数传递给 maven-jar-plugin
(例如 compilerArgs
传递给 maven-compiler-plugin
)吗?
也许你可以使用这个:
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
然后编辑 MANIFEST.MF 文件
Main-Class: classname
编辑: 我找到了这个配置
<configuration>
<archive>
<manifest>
<mainClass>com.Main</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
临时解决方法是在 package
阶段调用 jar --update
:
<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>
我乐于接受更好的想法。
这可以通过 maven-jar-plugin 3.1.2+ 版本(尚未发布,但 issue is closed)实现:
<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>
Starting with version 3.1.2, if the JAR file contains module-info.class, this plugin will update the modular descriptor (module-info.class) with additional attributes [...]. The most notable additional attribute added is the module main class.
基本上它采用添加到 Manifest 文件中的值,并将其添加到模块信息中。