一直依赖做的maven项目几乎都是spring项目,无脑导入个spring-boot-maven-plugin就能打包到处跑了。最近做了一个java脚本程序,懒得找包一个个导入library了,直接使用了maven工程,编译运行都没问题,打包后执行报错提示:java.lang.NoClassDefFoundError
根据上面的报错原因,是找不到我导入的maven的依赖,我很确定我在dependencies中是有导入了的,不然我开发的时候怎么执行的呢。那它还是找不到的原因,只可能是打包的时候真的没有把依赖的文件打包进去。
我们来求证一下这个推理,找到打好的包,使用压缩文件工具打开检查文件
真的除了我代码中的文件,maven依赖的包它是一个都没给我放进去,难怪会找不到文件呢
导入maven插件工具shade即可解决该问题,在开发工具中,下面的goals -> goal中的shade会变红色,我也不知道为什么,但是我可以很确定告诉你,就是这么配置的。
还需要注意的是,这个插件与maven-jar-plugin
是要共存的,否则会无法打包。而且如果执行的时候提示没有主清单属性,则需要在maven-jar-plugin中补充mainClass属性。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.YourMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.3.0</version> <!-- 使用最新版本 -->
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
加了这段配置之后,打包会生成两个 jar包,其中后缀为jar-with-dependencies
就是你要拿去执行的包。
或者使用maven-assembly-plugin
也可以,不过这个通常会在线上拉包,我个人不太喜欢,不过也给出示范了
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version> <!-- 使用最新版本 -->
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>your.main.Class</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>