Maven部署后生成的jar包如何运行?打包规则与依赖相关疑问
Maven常见疑问解答
你观察到打包产物仅包含src/main/java编译后的class文件是Maven默认打包插件的标准行为,以下是对应问题的解答:
1. 运行Maven部署操作时,是否会将代码打包为jar格式并上传至远程仓库?
是的,mvn deploy命令会按Maven生命周期顺序执行编译、测试、打包、验证等前置阶段,默认会按照pom中指定的打包类型(缺省为jar)生成当前模块的构件,连同模块的pom文件一起,上传至pom中<distributionManagement>节点配置的对应远程仓库。如果是多模块项目,每个子模块都会生成独立构件分别上传。
2. 打包生成的jar包是如何运行的?
Maven默认生成的普通jar包无法直接运行,因为它既没有指定入口主类信息,也没有包含依赖内容,要运行jar有两种常用方案:
- 手动指定类路径运行:使用
java -cp命令将当前jar包和所有依赖的jar包都加入JVM类路径,同时指定入口主类的全限定名,命令示例:java -cp yourProject.jar:dependency1.jar:dependency2.jar com.yourpackage.YourMainClass - 打包为可执行jar:通过配置Maven打包插件(常用的有maven-assembly-plugin、maven-shade-plugin、spring-boot-maven-plugin),在打包阶段将入口主类路径写入jar包的MANIFEST.MF文件,同时把所有依赖包整合进输出的jar中,最终生成的可执行jar可以直接用
java -jar yourProject.jar命令运行。
3. 该jar包运行时不需要pom文件中声明的所有依赖jar包吗?
必须需要依赖才能正常运行。你看到默认打包的jar中没有依赖内容,是因为Maven默认的maven-jar-plugin仅负责打包当前模块的编译产物,不会把pom声明的依赖一并打入jar中。
你在编码、测试阶段可以正常调用依赖的类,是因为Maven会自动在构建阶段维护类路径,把所有依赖都加入类路径中,你不需要手动处理。但单独运行jar时,必须保证所有依赖都在JVM的类路径下可被加载,否则会抛出ClassNotFoundException、NoClassDefFoundError之类的类加载错误。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

