maven 模块打包
1)maven 模块打包jar文件时,指定包含依赖(with-dependencies);
2)maven 模块打包jar文件时,指定入口MainClass、打包生成可执行的jar;
vi qftools/common/src/main/java/com/xxx/qftools/common/Main.java
package com.xxx.qftools.common;
public class Main {
public static void main(String args[]) {
System.out.printf("Hello");
}
}
vi qftools/common/pom.xml
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
</plugin>
<!-- maven-shade-plugin: 将所有依赖包都打进jar包中,jar命名带后缀 shaded-with-dependency -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 设置将依赖整合到一个自定义名称的 JAR 包。如果不设置此项,
依赖将整合到 Maven 无插件时的默认 JAR 包,并生成一个前缀为 original- 的无依赖 JAR 包。
-->
<shadedArtifactAttached>true</shadedArtifactAttached>
<!-- 设置生成的 JAR 包后缀名 -->
<shadedClassifierName>shaded-with-dependencies</shadedClassifierName>
<!-- 设置程序运行入口 -->
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxx.qftools.common.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
编译打包后生成2个jar文件:
common-1.0-SNAPSHOT-shaded-with-dependencies.jar (打包包含了所有依赖)
common-1.0-SNAPSHOT.jar (不包含依赖)
执行jar(with-dependencies的指定拉MainClass的jar,执行时无需再指定MainClass):
java -jar common-1.0-SNAPSHOT-shaded-with-dependencies.jar
执行jar(未指定MainClass的jar,执行时必须 -cp 指定MainClass):
java -cp common-1.0-SNAPSHOT.jar com.xxx.qftools.common.Main
如果 java -jar 执行 未指定MainClass的jar时,会报错jar中没有主清单属性(即:jar文件中的META-INF/MANIFEST.MF文件中没有 Main-Class: com.xxx.qftools.common.Main)
java -jar common-1.0-SNAPSHOT.jar
common-1.0-SNAPSHOT.jar中没有主清单属性