运行mvn package
打包编译的包含main()
的java程序后,
-
创建的jar文件不包含依赖项,所以在运行jar文件时,我仍然需要提供依赖项,这正确吗?
-
创建的jar文件没有指示其中哪个.class文件包含
main()
作为入口点,所以在运行jar文件时,我仍然必须指示包含main()
的.class,这是正确的吗?
谢谢。
这取决于情况。默认情况下,答案是肯定的,它不包含此信息。
但是Maven可以配置为包含这些内容。为了包含依赖项,可以使用Maven Assembly插件并使用jar-with-dependencies
设置将其绑定到包阶段,或者使用Maven Shade插件(也绑定到包相位(。它们是相似的,尽管我更喜欢Shade插件,因为它支持所谓的transformer,可以解决将多个jar文件合并为一个jar文件时遇到的一些问题。
要将主类定义为入口点,可以配置Maven编译插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<mainClass>my.main.Class</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
如果这样配置,则不必调用java -cp my.jar my.main.Class arguments
,只需将其称为java -jar my.jar arguments
即可。如果您还有额外的依赖项,您可以用java -jar my.jar -cp dependencies/*.jar arguments
来调用它。