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中没有主清单属性
另外:
java -jar common-1.0-SNAPSHOT-shaded-with-dependencies.jar
如果有依赖的lib需要加载,则执行:
java -Xbootclasspath/a:dep.jar -jar common-1.0-SNAPSHOT-shaded-with-dependencies.jar文章来源:https://www.toymoban.com/news/detail-629346.html
注意:-classpath 没有用,如果执行:java -classpath dep.jar -jar common-1.0-SNAPSHOT-shaded-with-dependencies.jar 无效。原因是使用 classpath 指定的 jar 是由 AppClassloader 来加载,java 命令加了-jar 参数之后,AppClassloader 就只关注 -jar 指定的 jar 文件范围内的 class 了,classpath 参数失效。
可以使用下面参数指定依赖jar的加载:
-Xbootclasspath/a: 在系统class加载后加载。通常用这个。
-Xbootclasspath/p: 在系统class加载前加载,容易和系统类冲突。文章来源地址https://www.toymoban.com/news/detail-629346.html
到了这里,关于maven 模块打包时包含依赖和打包可执行的jar的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!