Maven发布因本地修改失败:自动生成Avro文件排除无效求助
问题背景
通过Jenkins流水线执行Maven发布,使用的共享流水线命令参数如下:
mvn release:prepare release:perform '-Dgoals=deploy -DpushChanges=false -DlocalCheckout=true -DpreparationGoals=initialize' '-Darguments="-Dmaven.javadoc.skip=true -Dskip.master=true"' '-DtagNameFormat="@{project.version}"' '-Dresume=false'
发布阶段失败,报错显示自动生成的Avro文件被检测为本地修改:
Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5.3:prepare (default-cli) on project myProject: Cannot prepare the release because you have local modifications :
[myProject/src/main/java/com/schema/avro/GlobalLinePlanStyle.java:modified]
该文件由Avro Maven插件自动生成,插件配置将输出目录设为src/main/java;尝试在maven-release-plugin中配置checkModificationExcludes排除该文件,但未生效。
解决方案
1. 修正checkModificationExcludes的路径配置
release插件的排除路径需基于项目根目录的相对路径,之前的配置缺少前缀导致匹配失败。修改配置为:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> <configuration> <checkModificationExcludes> <checkModificationExclude>src/main/java/com/schema/avro/GlobalLinePlanStyle.java</checkModificationExclude> <!-- 或用通配符匹配所有Avro生成文件 --> <!-- <checkModificationExclude>**/com/schema/avro/*.java</checkModificationExclude> --> </checkModificationExcludes> </configuration> </plugin>
2. 调整Avro插件输出目录(推荐方案)
将自动生成的文件放到target目录(Maven默认生成文件目录),避免被Git和release插件追踪。修改Avro插件配置:
<plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>${avro.version}</version> <configuration> <sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory> <!-- 修改输出目录到target下 --> <outputDirectory>${project.build.directory}/generated-sources/avro</outputDirectory> <fieldVisibility>PRIVATE</fieldVisibility> <includes> <include>**/*.avsc</include> </includes> </configuration> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>schema</goal> </goals> </execution> </executions> </plugin>
同时添加maven-compiler-plugin配置,让编译器识别生成的文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <includes> <include>**/*.java</include> </includes> <generatedSourcesDirectory>${project.build.directory}/generated-sources</generatedSourcesDirectory> </configuration> </plugin>
3. 在release命令中直接指定排除参数
若pom配置无法生效,可在Jenkins的mvn命令中直接追加排除参数:
mvn release:prepare release:perform '-Dgoals=deploy -DpushChanges=false -DlocalCheckout=true -DpreparationGoals=initialize' '-Darguments="-Dmaven.javadoc.skip=true -Dskip.master=true"' '-DtagNameFormat="@{project.version}"' '-Dresume=false' '-DcheckModificationExcludes=src/main/java/com/schema/avro/GlobalLinePlanStyle.java'
4. 临时跳过修改检查(不推荐)
若以上方案无法快速解决,可临时添加参数跳过所有本地修改检查,但此操作会忽略真实的本地修改风险,仅作应急使用:
mvn release:prepare release:perform '-Dgoals=deploy -DpushChanges=false -DlocalCheckout=true -DpreparationGoals=initialize' '-Darguments="-Dmaven.javadoc.skip=true -Dskip.master=true"' '-DtagNameFormat="@{project.version}"' '-Dresume=false' '-DcheckModifications=false'
内容的提问来源于stack exchange,提问作者Pavitar

