如果svn过期,Maven将停止构建

如果svn过期,Maven将停止构建,maven,svn,maven-3,buildnumber-maven-plugin,maven-enforcer-plugin,Maven,Svn,Maven 3,Buildnumber Maven Plugin,Maven Enforcer Plugin,在阅读了很多SO问题以及其他网站之后,我仍然无法准确地解决这个问题 我们有一个很长的构建周期(10-20分钟),因为有很多依赖项。有时,您在开始构建时,所有事情都是最新的,但在构建过程中,有人将新的更改推送到远程svn 我希望Maven检查所有相关项目的验证和验证阶段,如果svn基本上仍然是最新的 我试过使用这个插件,但没有成功。执法者似乎可以做到这一点,但我还没有弄清楚应该制定哪些规则。 另一方面,buildnumber插件检查是否没有本地修改,但我认为它不会检查远程更改 我认为POM与这个问

在阅读了很多SO问题以及其他网站之后,我仍然无法准确地解决这个问题

我们有一个很长的构建周期(10-20分钟),因为有很多依赖项。有时,您在开始构建时,所有事情都是最新的,但在构建过程中,有人将新的更改推送到远程svn

我希望Maven检查所有相关项目的
验证
验证
阶段,如果svn基本上仍然是最新的

我试过使用这个插件,但没有成功。执法者似乎可以做到这一点,但我还没有弄清楚应该制定哪些规则。 另一方面,buildnumber插件检查是否没有本地修改,但我认为它不会检查远程更改


我认为POM与这个问题不太相关,但如果有人需要它,或某些部分,请让我知道,我会更新它。

我会尝试使用和Enforcer的组合


scm:diff
可以配置为将输出写入文件。在没有更改的情况下运行,查看文件有多大,或者,如果没有更改,它是否生成了文件。然后,使用Enforcer插件的
requireflelesdontextist
和/或
requireflelesize
规则确保
scm:diff
输出文件是您确定的“无更改”大小。如果大于这个值,则在构建过程中提交了更改。

经过大量测试,我找到了另一个解决方案。此解决方案适用于使用SVN的人员,他们只希望在构建成功后提交更改,并且需要对构建使用最新版本

这样做的目的是从SVN检索最新的修订号并更新工作副本。在构建过程结束时,它将再次检查修订号,以确保没有人推动任何更改

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.2</version>
<executions>
    <execution>
        <id>get-svn-local-revision-before</id>
        <phase>validate</phase>
        <goals>
            <goal>create</goal>
        </goals>
        <configuration>
            <doCheck>false</doCheck>
            <doUpdate>true</doUpdate>
            <buildNumberPropertyName>buildNumberLocal</buildNumberPropertyName>
            <useLastCommittedRevision>true</useLastCommittedRevision>
        </configuration>
    </execution>
    <execution>
        <id>get-svn-remote-revision-before</id>
        <phase>validate</phase>
        <goals>
            <goal>create</goal>
        </goals>
        <configuration>
            <doCheck>false</doCheck>
            <doUpdate>false</doUpdate>
            <buildNumberPropertyName>buildNumberRemote</buildNumberPropertyName>
            <useLastCommittedRevision>false</useLastCommittedRevision>
        </configuration>
    </execution>
    <!-- Repeat after everything is done -->
    <execution>
        <id>get-svn-remote-revision-after</id>
        <phase>verify</phase>
        <goals>
            <goal>create</goal>
        </goals>
        <configuration>
            <doCheck>false</doCheck>
            <doUpdate>false</doUpdate>
            <buildNumberPropertyName>buildNumberRemote</buildNumberPropertyName>
            <useLastCommittedRevision>false</useLastCommittedRevision>
        </configuration>
    </execution>
</executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.3.1</version>
    <executions>
    <execution>
        <id>check-svn-revisions-before</id>
        <phase>process-test-resources</phase>
        <goals>
            <goal>enforce</goal>
        </goals>
        <configuration>
            <rules>
                <evaluateBeanshell>
                     <condition>${buildNumberLocal} == ${buildNumberRemote}</condition>
                     <message>[ERROR] Local build (${buildNumberLocal}) doesn't match remote build (${buildNumberRemote})</message>
                </evaluateBeanshell>
             </rules>
             <fail>true</fail>
        </configuration>
    </execution>
    <!-- Repeat after everything is done -->
    <execution>
        <id>check-svn-revisions-after</id>
        <phase>verify</phase>
        <goals>
            <goal>enforce</goal>
        </goals>
        <configuration>
            <rules>
                <evaluateBeanshell>
                    <condition>${buildNumberLocal} == ${buildNumberRemote}</condition>
                    <message>[ERROR] Local build (${buildNumberLocal}) doesn't match remote build (${buildNumberRemote})</message>
                </evaluateBeanshell>
             </rules>
             <fail>true</fail>
        </configuration>
    </execution>
</executions>
</plugin>

org.codehaus.mojo
buildnumber maven插件
1.2
获取svn本地版本之前
验证
创造
假的
真的
buildNumberLocal
真的
获取svn远程修订之前
验证
创造
假的
假的
buildNumberRemote
假的
获取svn远程修订后
验证
创造
假的
假的
buildNumberRemote
假的
org.apache.maven.plugins
maven enforcer插件
1.3.1
检查svn修订之前
过程测试资源
执行
${buildNumberLocal}==${buildNumberRemote}
[错误]本地生成(${buildNumberLocal})与远程生成(${buildNumberRemote})不匹配
真的
完成后检查svn修订
验证
执行
${buildNumberLocal}==${buildNumberRemote}
[错误]本地生成(${buildNumberLocal})与远程生成(${buildNumberRemote})不匹配
真的

听起来真是个好主意!我明天试试,看看怎么样。您认为我可以从同一个Maven生命周期自动运行
scm:diff
?也许在最后?当然。要在验证和验证阶段都运行,您需要将SCM和Enforcer插件都添加到POM中(按该顺序)。然后,使用您确定的配置为每个插件添加2次执行。每一个的第一个执行绑定到验证阶段,第二个执行绑定到验证阶段。Maven将在构建的开始和结束时运行这两个目标。尽管它几乎可以工作,但是scm diff生成了文件,然后强制执行器检查其大小。我有一个问题与scm插件,虽然,我不能得到它忽略文件使用配置。有什么想法吗?我想的另一个选择是在开始和结束时生成diff文件,并对两者进行比较。虽然我仍然在寻找一种方法来使用enforcer比较两者。找到了另一个解决方案,我会将它作为另一个答案发布,以防有人需要它。