【发布时间】:2012-02-26 18:13:34
【问题描述】:
我使用 Maven 发布插件。在我的 pom 中存在和 Ant 任务,它使用附加信息自动修复一些属性文件。此修复不应该在 SCM 中。 但是 maven 并没有因为错误而成功:
Cannot prepare the release because you have local modifications
是否可以设置一些参数不检查本地修改?
谢谢。
【问题讨论】:
我使用 Maven 发布插件。在我的 pom 中存在和 Ant 任务,它使用附加信息自动修复一些属性文件。此修复不应该在 SCM 中。 但是 maven 并没有因为错误而成功:
Cannot prepare the release because you have local modifications
是否可以设置一些参数不检查本地修改?
谢谢。
【问题讨论】:
我对 maven-release-plugin 不是很熟悉,但我可以看到有一个 checkModificationExcludes 属性可以用于您的目的。配置应该有点像这样:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.2.2</version>
<configuration>
...
<checkModificationExcludes>
<checkModificationExclude>file_1</checkModificationExclude>
<checkModificationExclude>dir_1/file_2</checkModificationExclude>
</checkModificationExcludes>
</configuration>
</plugin>
【讨论】:
我们试图从 jenkins 运行发布,但它总是失败并显示相同的消息...
Cannot prepare the release because you have local modifications
...这很奇怪,因为我们使用 jenkins 在发布之前检查并构建最新的源代码。
我们最终发现问题在于我们在 Windows 节点上构建,并且某些文件路径太长导致 maven-release-plugin 抱怨本地修改。切换到 linux 节点解决了这个问题。
【讨论】:
从源代码管理中删除我的项目的 target 文件夹为我解决了这个问题。
【讨论】:
我建议修复您的构建过程,以便它不会“修复” SCM 下的文件。有几种方法可以做到这一点,最简单的是将有问题的属性文件复制到${project.build.outputDirectory} 下的某个目录,然后在这些文件上运行您的 Ant 脚本,而不是原始文件
【讨论】:
@AndrewLogvinov 的回答已经完成了一半。 The other half is mentioned in this:
我发现比较 在 org.apache.maven.shared.release.phase.ScmCheckModificationsPhase.execute() 剥离路径并仅比较文件名。所以,我改变我的pom忽略 application.properties 而不是 ${thewholepath}/applications 属性。 瞧,成功了。
由于某些奇怪的原因,您不能在此标记中包含路径。您只能指定文件名。
【讨论】:
在我的例子中,它通过将作业名称重命名为更短的长度(大约 20 个字符)在 Windows 上运行。
在我的例子中,Jenkins 的工作名称和 svn 分支名称更长(大约 40 个字符)。 如果某些文件路径太长,它会导致 maven-release-plugin 抱怨本地修改。 Jenkins 使用作业名称创建一个本地工作区
例如如下所示,发布时 Jenkins 工作将开始抱怨本地修改。
D:\dev.env\data\jenkins\jobs\<LongerJobName>\workspace\<LongerBranchName>\testCommonJar\src\main\java\com.example.webservice.service.TestServiceImpl.java
【讨论】: