如何在另一台电脑上解决Maven项目JAR包的依赖缺失问题?
解决Maven打包JAR后依赖缺失的问题
我太懂这种打包好的程序换台电脑就崩的崩溃感了!你遇到的核心问题是:Maven默认的maven-jar-plugin只会打包你项目自身的代码,不会把声明的第三方依赖(比如你用到的Apache Commons Codec)包含进去。本地能正常运行是因为Maven已经把依赖下载到了本地仓库,运行时能自动找到这些依赖;但把单独的JAR移到另一台电脑后,那些依赖库不在目标机器上,程序自然找不到org/apache/commons/codec/digest/DigestUtils这类类了。
下面给你几个靠谱的解决方案,按需选择就行:
方案1:用maven-assembly-plugin打“胖JAR”(最简单直接)
这个插件能把你项目的代码和所有依赖打包到一个单独的JAR文件里,拿到别的电脑直接就能运行。
步骤:
- 在你的
pom.xml里添加插件配置,放在<build><plugins>节点下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <!-- 指定主类,就是你程序的入口类 --> <archive> <manifest> <mainClass>com.your.package.YourMainClass</mainClass> </manifest> </archive> <descriptorRefs> <!-- 这个引用会把所有依赖打包进去 --> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
- 执行打包命令:
mvn clean package
- 打包完成后,在
target目录下会生成两个JAR:一个是默认的仅含自身代码的JAR,另一个是带-jar-with-dependencies后缀的胖JAR,把这个胖JAR移到别的电脑,直接用java -jar your-project-jar-with-dependencies.jar就能运行了。
方案2:用maven-shade-plugin打包(更灵活,适合复杂项目)
这个插件比assembly功能更强,能处理依赖冲突、重命名类等场景,很多开源项目都用它打包。
步骤:
- 在
pom.xml的<build><plugins>节点下添加配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 指定主类 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.your.package.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
- 执行打包命令:
mvn clean package
- 打包后
target目录下的主JAR就是包含所有依赖的胖JAR,直接运行即可。
方案3:手动管理依赖(不推荐,适合特殊场景)
如果不想打胖JAR,可以把所有依赖JAR放到和你的项目JAR同一目录的lib文件夹里,然后运行时指定类路径:
- Linux/macOS下:
java -cp your-project.jar:lib/* com.your.package.YourMainClass
- Windows下(注意路径分隔符是分号):
java -cp your-project.jar;lib\* com.your.package.YourMainClass
这种方式需要手动拷贝所有依赖,比较麻烦,容易漏包,所以优先推荐前两种方案。
⚠️ 注意:不管用哪种方案,一定要确保配置里的mainClass是你程序的正确入口类,不然运行时会提示“找不到主类”。
内容的提问来源于stack exchange,提问作者user6764882
相关产品推荐
相关产品推荐

