默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到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.virhuiai.www
-DartifactId=hello-world
-DpackageName=com.virhuiai.www
-DarchetypeVersion= RELEASE
查看下生成的项目结构:
tree -C hello-world
其中 pom .xml的部分如下:
如果要指定版本号,即将jdk版本替换为1.8:
cd hello-world/
sed -ri -e 's!<maven.compiler.source>1.7</maven.compiler.source>!<maven.compiler.source>1.8</maven.compiler.source>!g' pom.xml
sed -ri -e 's!<maven.compiler.target>1.7</maven.compiler.target>!<maven.compiler.target>1.8</maven.compiler.target>!g' pom.xml
方法一:maven-shade-plugin
官网地址在:
按说明,在pom.xml中添加以下内容:
< build >
。。。
<pluginManagement>
。。。
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
< execution s>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.virhuiai.www.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/target/hello-world-1.0-SNAPSHOT.jar with /usr/src/mymaven/hello-world/target/hello-world-1.0-SNAPSHOT-shaded.jar
说明已经被替换成带有Main-Class信息的可运行jar。
现在,在项目根目录中执行该jar文件:
root@9275e11b3f0f:/usr/src/mymaven/hello-world# java -jar /usr/src/mymaven/hello-world/target/hello-world-1.0-SNAPSHOT.jar
Hello World!
方法二:maven-jar-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.virhuiai.www.App</mainClass> <!-- //主程序入口类,可以按住control,单机定位到该类-->
</manifest>
</archive>
</configuration>
</plugin>
注意这也是直接位于build>plugins下的,不是pluginManagement里的,pluginManagement指定版本号。