默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF文件,将无法看到Main-Class一行)。
用maven打包java程序,当执行 java -jar 文件时提示 no main manifest attribute。
为了生成可执行的jar文件,需要借助插件。
目录:
生成示例项目
# 进入你想创建项目的父文件夹 cd /Volumes/RamDisk # 查看当前文件夹 pwd
# 生成项目 docker run -itd --rm --name maven_quick_tmp \ -v "$HOME/.m2/repository":/root/.m2/repository \ -v "$PWD":/usr/src/mymaven \ -w /usr/src/mymaven \ virhuiai/maven_quick:version-aliyun \ mvn archetype:generate \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false \ -DarchetypeVersion=1.4 \ -DgroupId=com.vir \ -DartifactId=hello-world \ -DpackageName=com.vir \ -DarchetypeVersion=RELEASE
查看下生成的项目结构:
tree -C hello-world
其中的部分如下:
如果要指定版本号,即将jdk版本替换为1.8:
cd hello-world/ sed -ri -e 's!<maven.com;1.7</maven.com;!<maven.com;1.8</maven.com;!g' sed -ri -e 's!<maven.com;1.7</maven.com;!<maven.com;1.8</maven.com;!g'
方法一:maven-shade-plugin
官网地址在:
按说明,在中添加以下内容:
<build> 。。。 <pluginManagement> 。。。 </pluginManagement> <plugins> <plugin> <groupId>org.a;/groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.a;> <mainClass>com.vir.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
注意这是直接位于build>plugins下的,不是pluginManagement里的,否则不会有效果()。
现在执行mvn clean install:
mvn clean install
其中有句:
Replacing /usr/src/mymaven/hello-world/targe with /usr/src/mymaven/hello-world/targe
说明已经被替换成带有Main-Class信息的可运行jar。
现在,在项目根目录中执行该jar文件:
root@9275e11b3f0f:/usr/src/mymaven/hello-world# java -jar /usr/src/mymaven/hello-world/targe Hello World!
方法二:maven-jar-plugin
<plugin> <groupId>org.a;/groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.vir.App</mainClass> <!-- //主程序入口类,可以按住control,单机定位到该类--> </manifest> </archive> </configuration> </plugin>
注意这也是直接位于build>plugins下的,不是pluginManagement里的,pluginManagement指定版本号。