最近在idea中使用maven打包一个jar,各种踩坑,记录如下。
首先,本次的项目是 含maven的java普通项目 。
踩坑开始。
第一个就是,java: 程序包com.sun.istack.internal不存在
这是因为我在项目中引用了。
import com.sun.istack.internal.NotNull;
这个类。
解决办法,如下。
在 pom.xml 找到。
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
改为:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerArgs>
<!-- 过期的方法的警告-->
<arg>-Xlint:deprecation</arg>
</compilerArgs>
<compilerArguments>
<!-- 是否输出所有的编译信息(包括类的加载等)-->
<!--<verbose />-->
<!-- 解决maven命令编译报错,因为rt.jar 和jce.jar在jre的lib下面,不在jdk的lib下面,
导致maven找不到(java7以后会出现这个问题),将这2个jar包拷贝到jdk的lib下面估计也好使-->
<bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
完美解决。
打包jar(不含依赖)
直接按下图操作。
因为 maven-archetype-quickstart 中已经包含了一系列常用的插件,其中就有 maven-jar-plugin 所以可以直接按上图打包jar
生成的 jar 会在 项目名/target/项目名.jar 中 。
打包jar(含依赖,踩坑重点)
关于在Maven中的 pluginManagement 请点击查看。
初次使用maven的不太知道这些,一般都会直接在 pom.xml build->pluginManagement 子项下直接这么写。然后,就没有然后了...也就是始终无法将引用的依赖一起打包到 jar 中。
伪代码:
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
...
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>single</goal><!-- 只运行一次 -->
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
因为 pluginManagement 后面有这一段提示。
<!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
所以,解决办法:可以在 build 中添加一个未加锁的 <plugins></plugins>
伪代码:
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
...
</pluginManagement>
<!-- 自定义导入plugins -->
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>single</goal><!-- 只运行一次 -->
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <!-- 默认描述文件 -->
</descriptorRefs>
<!--<descriptor>assembly.xml</descriptor>--> <!-- 自定义描述文件 -->
</configuration>
</plugin>
</plugins>
</build>
然后再双击运行 package 执行打包(记得 clean),关于自定义描述文件,可看 这篇文章 。
成功含赖打包
第二个 -jar-with-dependencies.jar 就是带有依赖的jar了。