java -jar 执行基于Maven构建的Java应用的方法总结
一、Maven pom.xml文件未指定主类的情况
1、用Maven打包
mvn clean package -DskipTests
2、用java命令执行jar包
java -cp maven-allin-mainclass-demo-1.0-SNAPSHOT.jar org.example.Main
二、Maven pom.xml文件指定主类的情况
1、pom.xml文件指定主类,有两种方式:
(1)使用 maven-shade-plugin插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 指定主类 -->
<mainClass>org.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2)使用 maven-jar-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<!-- 指定主类 -->
<mainClass>org.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
(3)两种方式的小结
maven-shade-plugin:适用于创建包含所有依赖项的可执行 JAR 文件。
maven-jar-plugin:适用于创建标准的 JAR 文件,需要手动处理依赖项。
可以依据项目的实际需求选择合适的插件。配置完成后,运行 mvn package 命令打包项目,之后就能够使用 java -jar 命令运行生成的 JAR 文件了。
2、用Maven打包
mvn clean package -DskipTests
3、用java命令执行jar包
java -jar maven-allin-mainclass-demo-1.0-SNAPSHOT.jar
三、使用三方组件依赖,将依赖的Jar包打入到应用的Jar包中
1、pom.xml文件指定主类,有两种方式:
(1)使用 maven-shade-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 指定主类 -->
<mainClass>org.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2)使用 maven-assembly-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<archive>
<manifest>
<!-- 指定主类 -->
<mainClass>org.example.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
(3)两种方式的小结
maven-shade-plugin:适用于创建包含所有依赖项的可执行 JAR 文件,可对资源和类进行转换。
maven-assembly-plugin:适用于创建包含依赖项的 JAR 文件,支持多种打包格式,配置相对简单。
你可以根据项目的实际需求选择合适的插件。配置完成后,运行 mvn package 命令打包项目,即可生成包含依赖项的 JAR 文件。
2、用Maven打包
mvn clean package -DskipTests
3、用java命令执行jar包
# 用maven-shade-plugin插件构建,则执行: java -jar maven-allin-mainclass-demo-1.0-SNAPSHOT.jar # 用maven-assembly-plugin插件构建,则执行: java -jar maven-allin-mainclass-demo-1.0-SNAPSHOT-jar-with-dependencies.jar
四、总结
1、使用Maven以及其他类似的工具,帮我们省去了很多琐碎的操作,如:用javac编译每一个java文件、将所有java类文件与其他资源文件打包成Jar文件等
2、在上文中提及的构建与执行Java应用可分为:不使用Maven插件和使用Maven插件的两种情况。
3、使用Maven插件的情况,用了三种Maven插件:maven-shade-plugin、maven-jar-plugin、maven-assembly-plugin。这三种插件在功能上有一些差别:
Maven插件 | 指定主类 | 将依赖的Jar一起打包 | 生成的Jar文件 |
maven-shade-plugin | ✓ | ✓ | maven-allin-mainclass-demo-1.0-SNAPSHOT-jar-with-dependencies.jar -- 含依赖的Jar文件内容 maven-allin-mainclass-demo-1.0-SNAPSHOT.jar -- 不含依赖的Jar文件内容 |
maven-jar-plugin | ✓ | ✕ | maven-allin-mainclass-demo-1.0-SNAPSHOT.jar -- 不含依赖的Jar文件内容 |
maven-assembly-plugin | ✓ | ✓ | maven-allin-mainclass-demo-1.0-SNAPSHOT.jar -- 含依赖的Jar文件内容 original-maven-allin-mainclass-demo-1.0-SNAPSHOT.jar -- 不含依赖的Jar文件内容 |
五、示例代码
示例代码已上传到GITHUB和GITEE:
https://github.com/tanjianhui/maven-allin-mainclass-demo
https://gitee.com/tanjianhui/maven-allin-mainclass-demo