Maven多模块项目maven-assembly-plugin打包Jar缺失主类问题
报错信息
Could not find or load main class (module)
问题原因
主类未被打入Jar的核心原因共2点:
- 多模块Maven项目的根POM(父工程)默认
packaging类型为pom,本身不存放业务源码,也不会产生编译后的class文件。将maven-assembly-plugin配置在根POM中执行打包时,插件默认只会收集当前根模块自身的编译产物和依赖,不会自动拉取两个子模块的编译结果纳入Jar包。 - 根POM的配置中没有将两个子模块声明为当前项目的编译期依赖,插件完全感知不到子模块的存在,最终打包时没有任何class文件可以纳入,就会出现Jar内仅存在
Manifest.mf的情况。
解决方法
推荐按照Maven多模块项目的标准规范调整配置:
- 将当前写在根POM中的
maven-assembly-plugin完整配置,移动到主类所在的first-module模块下的pom.xml的build -> plugins节点中。 - 在
first-module的pom.xml中添加对second-module的依赖,保证工具类可以被正常识别打包:
<dependency> <groupId>你的项目groupId</groupId> <artifactId>second-module</artifactId> <version>${project.version}</version> </dependency>
- 执行打包命令时,在项目根目录运行:
mvn clean package -pl first-module -am
其中-pl first-module指定要构建的目标模块是first-module,-am参数会自动构建first-module依赖的其他关联模块(也就是second-module),避免依赖缺失报错。 - 打包完成后,可执行Jar会生成在
first-module/target目录下,使用jar tvf <Jar文件名>可以验证包内已经包含com/example/MyClass.class以及所有依赖类,此时执行java -jar <Jar文件名>即可正常运行,不会再抛出找不到主类的错误。
不推荐在根POM中直接配置打包插件:如果强行在根POM打包,需要额外在根POM中把两个子模块都声明为compile范围的依赖,这种方式违背了多模块父工程仅做版本管控、依赖统一管理的设计初衷,后续维护很容易出现依赖遗漏问题。
内容的提问来源于stack exchange,提问作者devuser123
相关产品推荐
相关产品推荐

