将 Perforce scm 配置到 maven 项目中以获取最新的更改列表

Posted

技术标签:

【中文标题】将 Perforce scm 配置到 maven 项目中以获取最新的更改列表【英文标题】:Configuring Perforce scm into maven project to get latest changelist 【发布时间】:2012-03-27 08:00:46 【问题描述】:

我正在将一个项目迁移到 Maven,并且由于我们习惯于始终通过 Perforce SCM 存储库中的最新更改编号来引用我们的构建,我希望能够提取此信息

我正在尝试通过以下资源配置 Maven scm 插件:

http://maven.apache.org/scm/maven-scm-plugin/usage.html 通用 http://www.perforce.com/perforce/doc.current/manuals/p4maven/index.html

首先我不明白如何让它工作,所以如果有人有一个完全工作的例子,我会很高兴,我已经尝试通过添加我的 pom:

<scm>
    <connection>
        scm:perforce:localhost:1666://depot/
        <my_project>
            /
            <version>
    </connection>
    <developerConnection>
        scm:perforce:localhost:1666:/depot/
        <my_project>
            /
            <version>
    </developerConnection>
    <url>http://somerepository.com/view.cvs</url>
</scm>
...
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-scm-plugin</artifactId>
        <version>1.6</version>
        <dependencies>
            <!-- P4Maven -->
            <dependency>
                <groupId>com.perforce</groupId>
                <artifactId>p4maven</artifactId>
                <version>[2011,2012)</version>
            </dependency>
        </dependencies>
        <configuration>
            <connectionType>//depot/proto/kernel/kernel/04.00/maven2</connectionType>
            <username>my local username</username>
            <password>xxxxxx</password>
            <includes>**</includes>
        </configuration>
    </plugin>
</plugins>

这导致我:

[INFO] --- maven-scm-plugin:1.6:checkout (default-cli) @ kernel ---
mars 27, 2012 9:54:08 AM org.sonatype.guice.bean.reflect.Logs$JULSink warn
Avertissement: Error injecting: org.apache.maven.scm.provider.svn.svnexe.SvnExeScmProvider
java.lang.NoClassDefFoundError: org/apache/maven/scm/command/info/InfoScmResult

肯定忘记了什么,我会尝试再次阅读说明,看看我错过了什么,但如果有人知道......

无论如何,我的问题是:值得尝试吗? 我在 scm 插件的可用操作中没有看到任何可以帮助我获取最新更改信息并将其集成到参考内部版本号中的内容。我应该为此开发自己的插件吗?

提前致谢。

【问题讨论】:

【参考方案1】:

我从一位 P4Maven 开发人员那里得到了一些可能会有所帮助的建议。

首先,检查您的配置。 “”标签中的“...”应该是“”标签中的标签名称之一(即“connection”或“developerConnection”)

将 Maven 与 Perforce SCM 结合使用有两种选择。

    使用默认(内置)Maven Perforce SCM 提供程序(基于 p4 命令行)

    请注意,您需要安装 p4 命令行可执行文件 您可以使用环境变量或 JVM args 设置用户名和密码

[环境变量] P4客户= P4用户= P4PASSWD=

[JVM 参数] -Dusername= -Dpassword=

[pom.xml] ...

  ...

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-scm-plugin</artifactId>
    <version>1.4</version>
  </plugin>

  ...

...

 <!-- SCM Settings -->
  <scm>
    <connection>scmerforce:localhost:1666://depot/someproject</connection>
    <developerConnection>scmerforce:localhost:1666://depot/someproject</developerConnection>
    <url>scmerforce://depot/simple</url>
  </scm>

...

    使用 P4Maven Perforce SCM 提供程序(基于 P4Java)

[pom.xml]

...

  ...

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-scm-plugin</artifactId>
    <version>1.4</version>
    <dependencies>
      <!-- P4Maven -->
      <dependency>
        <groupId>com.perforce</groupId>
        <artifactId>p4maven</artifactId>
        <version>[2011,2012)</version>
      </dependency>
    </dependencies>
    <configuration>
      <connectionType>connection</connectionType>
      <username>someuser</username>
      <password>somepassword</password>
      <includes>**</includes>
    </configuration>
  </plugin>

  ...

...

scm4:localhost:1666://depot/someproject scm4:localhost:1666://depot/someproject scm4://depot/someproject

...

请注意,对于 P4Maven,我们将覆盖“maven-scm-plugin”插件中的默认提供程序。

请注意,我们使用“scmp4”(如果使用 P4Maven)而不是“scmperforce”(内置默认)作为提供程序名称,因为现有默认实现采用“perforce”。

【讨论】:

感谢您的回答,我会尝试一下然后回来【参考方案2】:

我最近一直在努力解决完全相同的问题 - 我只是想获得一个 Perforce 修订号以在 maven 工件中使用它(例如作为名称的一部分)。我检查了buildnumber-maven-plugin,但它根本不支持 Perforce。我也尝试过maven-release-plugin,但在我看来它做得太多了,我什至不知道它是否能满足我的需要。

无论如何,我最终得到了一个我不喜欢的解决方案,但它确实有效。我通过 ant 和 antrun 插件直接使用 p4 可执行文件获取此修订号(您必须使用最新的 1.7 版本将 ant 属性导出到 maven)。您还需要有可用的 p4 可执行文件。

使用此插件配置后,您可以在 maven 中使用 $revision.number。

<!-- Get Perforce latest change number -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <dependencies>
        <dependency>
            <groupId>ant-contrib</groupId>
            <artifactId>ant-contrib</artifactId>
            <version>1.0b3</version>
        </dependency>
    </dependencies>
    <configuration>
        <exportAntProperties>true</exportAntProperties>
    </configuration>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="maven.plugin.classpath"/>
                    <!-- Login to p4 -->
                    <exec executable="p4" inputstring="$p4.password">
                        <arg value="-p$p4.server"/>
                        <arg value="-c$p4.client"/>
                        <arg value="-u$p4.username"/>
                        <arg value="login"/>
                    </exec>
                    <!-- Get reivision description text -->
                    <exec executable="p4" outputproperty="revision.description">
                        <arg value="-p$p4.server"/>
                        <arg value="-c$p4.client"/>
                        <arg value="-u$p4.username"/>
                        <arg value="changes"/>
                        <arg value="-m1"/>
                        <arg value="//...#have"/>
                    </exec>
                    <!-- Logout from p4 -->
                    <exec executable="p4">
                        <arg value="-p$p4.server"/>
                        <arg value="-c$p4.client"/>
                        <arg value="-u$p4.username"/>
                        <arg value="logout"/>
                    </exec>

                    <!-- Parse revision description to retrieve only revision number -->
                    <propertyregex property="revision.number"
                                   input="$revision.description"
                                   regexp="Change ([0-9]*) on ([a-z,0-9]*)"
                                   select="\1"
                                   casesensitive="false"/>

                    <echo>Perforce latest revision number: $revision.number</echo>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

嗨,我终于和你一样做了一个 maven 插件。虽然确实不是很令人满意。 希望有更好的解决方案。【参考方案3】:

问这个问题已经有几年了,但在此期间 p4maven 已被重写,并且更新的文档非常难以找到。

这是新的README.md。我遵循了它,一切正常。此时maven central中的最新版本是1.0.6。

我从 Maven 内部版本号插件页面上的链接中发现了源代码。

【讨论】:

【参考方案4】:

我在寻找类似问题的解决方案时来到这里,“可以确定没有配置”,这是我在使用 P4 的 Code Collaborator 客户端时遇到的。我最终卸载了 P4 客户端并重新安装以使其正常工作。

【讨论】:

以上是关于将 Perforce scm 配置到 maven 项目中以获取最新的更改列表的主要内容,如果未能解决你的问题,请参考以下文章

从环绕 SCM 迁移到 Perforce

[SCM]源码管理 - perforce命令行高级

基于线路的 SCM 责备信息存储在哪里?

maven的scm插件介绍及使用示例

Maven发布插件和scm插件配置

Maven:<scm> 配置中的 <url> 元素是做啥用的?