Maven发布至Nexus失败:Zip文件无法包含自身
解决Maven发布至Nexus时"A zip file cannot include itself"报错问题
你在通过Jenkins发布Maven项目到Nexus时碰到的这个报错,本质是打包过程出现了循环嵌套——生成的jar包被意外塞进了要打包的归档文件里,而Zip格式不允许这种自包含的情况。结合你的POM配置,我找到了关键问题点和修复方案:
问题根源分析
看你的<build>配置,有两处核心错误导致了这个问题:
- 主资源目录指向构建输出目录:你把
${project.build.directory}(也就是target目录)设为了主资源目录,而target里包含了maven-assembly-plugin生成的jar-with-dependencies包。当maven-source-plugin打包源码时,会把target下的所有文件(包括已经生成的jar)都塞进源码包,自然触发了"zip不能包含自己"的错误。 - 测试资源目录同样指向target:把
target作为测试资源目录也不合理,这会让测试阶段误引入构建产物,可能引发其他潜在问题。
具体修复步骤
1. 修正主资源目录配置
删除<build>下错误的<resources>配置,替换为标准的资源目录配置(如果需要保留自定义资源处理,基于src/main/resources调整即可):
<build> <!-- 替换原来错误的resources配置 --> <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> </resource> </resources> <!-- 其他原有配置保持不变 --> </build>
你的maven-resources-plugin已经通过copy-resources把不同环境的配置文件复制到target了,完全不需要再把target设为资源目录——Maven默认会把src/main/resources的内容打包进主jar。
2. 修正测试资源目录
把<testResources>指向标准的测试资源目录:
<build> <testResources> <testResource> <directory>src/test/resources</directory> </testResource> </testResources> <!-- 其他原有配置保持不变 --> </build>
3. 升级maven-assembly-plugin版本
你当前使用的maven-assembly-plugin版本是2.1,这个版本比较老旧,建议升级到较新的稳定版本(比如3.3.0),可以避免一些已知的打包问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.mains.MainClass</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>
修复原理说明
target目录是Maven的构建输出目录,专门用来存放编译后的class文件、生成的jar包等产物。如果把它加入到资源目录中,Maven在执行打包(包括源码包、主jar包)时会递归打包target下的所有内容,这就会把已经生成的jar包再次打包进去,形成"zip包含自身"的循环,触发报错。修正后,资源目录只包含源码目录下的原始资源,不会引入构建产物,就能彻底避免这个问题。
内容的提问来源于stack exchange,提问作者mohd shoaib
相关产品推荐
相关产品推荐

