Maven多模块项目无法正确部署至Maven Central求助
我遇到过好几个类似的多模块Maven部署问题,大概率是下面几个配置点你没注意到:
1. 父项目必须设置正确的packaging类型
这是最容易忽略的核心点!因为你的项目改成了多模块结构,主项目(父pom)的packaging必须设为pom,否则Maven会把它当成普通的jar项目处理,不会递归触发子模块的部署流程。
在主项目的pom.xml里添加:
<packaging>pom</packaging>
同时确保主pom里正确声明了所有子模块:
<modules> <module>子模块1的目录名</module> <module>子模块2的目录名</module> </modules>
2. 统一配置源码和Javadoc插件并绑定到构建阶段
子模块target里生成了源码和javadoc jar但没上传,说明这些jar没有被Maven的deploy流程识别为需要上传的附件。你需要在父pom里统一配置maven-source-plugin和maven-javadoc-plugin,并绑定到构建阶段,让每个子模块自动生成并附加这些jar到部署流程中。
在父pom的<build><pluginManagement>里添加:
<plugins> <!-- 生成并附加源码jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <!-- 生成并附加Javadoc jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins>
子模块的pom只需要继承父pom即可,不需要重复配置这些插件——pluginManagement会自动把配置传递给所有子模块。
3. 确保在根目录执行deploy命令
不要单独进入子模块目录执行mvn deploy,这样Maven只会处理当前子模块,还可能因为缺少父pom的上下文配置导致上传失败。必须在主项目的根目录执行:
mvn clean deploy -DskipTests
这样Maven会递归处理所有子模块,把每个模块的jar、源码jar、javadoc jar和pom都同步上传到Maven Central。
4. 检查Nexus Staging插件的配置
如果你用Sonatype的Nexus Staging插件(nexus-staging-maven-plugin)发布到Maven Central,要确保这个插件在父pom里配置,并且开启<extensions>true</extensions>,这样它能正确处理多模块项目的 staging 和发布流程:
<plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> <version>1.6.13</version> <extensions>true</extensions> <configuration> <serverId>ossrh</serverId> <nexusUrl>https://oss.sonatype.org/</nexusUrl> <autoReleaseAfterClose>true</autoReleaseAfterClose> </configuration> </plugin>
这个配置也要放在父pom的pluginManagement里,让子模块继承。
5. 排查子模块是否禁用了deploy流程
检查子模块的pom里有没有意外添加跳过deploy的配置,比如:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin>
如果有,删掉这个配置即可。
按照上面的步骤检查一遍,应该就能解决子模块源码和javadoc不上传的问题了。
内容的提问来源于stack exchange,提问作者renken

