maven发布:使用Perforce执行不会创建目标/结帐目录

时间:2014-10-26 16:53:36

标签: maven perforce maven-release-plugin

我不能让maven-release插件与Perforce一起使用。 release:prepare似乎正常工作:创建Perforce标签并包含正确的文件。然而,当我运行release时:执行它失败,因为target / checkout目录为空。

我做了一些实验。如果我只同步到我的pom.xml然后运行     mvn scm:结帐 然后我的其他文件被检出到P4根目录,就像我做了一样     p4同步... 然而Maven输出     [INFO]结帐工作目录:/ home / chris / perforce / pips / target / checkout     [INFO] sync -f // depot / pips / ... Maven认为它正在检查目标/结账,但事实并非如此。我稍微挖了一下P4Maven代码并在P4Executor.java中注意到了这一点

public String getRepoPath(P4ScmProviderRepository repo, File basedir) {
    // Handles a case where executing release:prepare on a module with an
    // invalid SCM location. The release.properties contains the invalid URL
    // for checkout during release:perform and the basedir is not the module
    // root. So, the trailing target/checkout directory must be removed.
    if (basedir.toString().replace('\\', '/').endsWith("/target/checkout")) {
        String dir = basedir.toString();
        basedir = new File(dir.substring(0, dir.length()
                - "/target/checkout".length()));
        if (getLogger().isDebugEnabled()) {
            logger.debug("Fixing checkout URL: " + basedir);
        }
    }

这段代码很清楚。 P4Maven不会检查目标/结账。如果你告诉它结账到目标/结账,它只会删除“目标/结账”并结账到根目录。这与我所看到的完成一致。我在运行release时执行

时也会看到“修复结帐URL”消息

人们如何解决这个问题?

下面是我的pom.xml。我在用   Perforce Server版本:P4D / LINUX26X86_64 / 2014.2 / 935585(2014/09/16)。 p4d在本地运行。身份验证已禁用,我不需要密码。   Nexus 2.10.0-02在本地运行。   Ubuntu Linux。   Maven 3.2.3   java 1.7.0_55

感谢。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap
ache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.icap</groupId>
  <artifactId>pips</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>pips</name>

  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <scm>
     <connection>scm:p4:192.168.1.8:1666://depot/pips</connection>
     <developerConnection>scm:p4:192.168.1.8:1666://depot/pips</developerConnection>
  </scm>

  <build>
    <plugins>

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

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.5.1</version>
        <dependencies>
          <!-- P4Maven -->
          <dependency>
            <groupId>com.perforce</groupId>
            <artifactId>p4maven</artifactId>
            <version>[2011,2012)</version>
          </dependency>
        </dependencies>
        <configuration>
          <connectionType>connection</connectionType>
          <username>chelck</username>
          <includes>**</includes>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
          <fork>true</fork>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.1</version>
        <scope>test</scope>
      </dependency>
  </dependencies>

<distributionManagement>
  <repository>
     <id>deployment</id>
     <name>Internal Releases</name>
     <url>http://localhost:8081/nexus/content/repositories/releases/</url>
  </repository>
  <snapshotRepository>
     <id>deployment</id>
     <name>Internal Releases</name>
     <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
  </snapshotRepository>
</distributionManagement>
</project>

1 个答案:

答案 0 :(得分:2)

我在perforce / maven / release集成上奋斗了好几天,终于让它运转起来了。以下是我的发现,他们可能会帮助您和其他有类似问题的人。

  1. 请勿使用perforce.com上描述的perforce插件http://www.perforce.com/perforce/r11.1/manuals/p4maven/index.html)。虽然这是谷歌搜索引出的第一个链接,但我的理解是这个插件已经过时了。
  2. 在您的配置中,如果您参考scm:p4:...您正在使用com.perforce插件。相反,使用使用scm:perforce:...语法的org.apache.maven.scm / maven-scm-provider-perforce。您的<scm>应如下所示:

    <properties>
      <p4path>//perforce-path/toyour/project</p4path>
    </properties>
    
    <scm>
      <connection>scm:perforce:yourp4server:1666:${p4path}</connection>
      <developerConnection>scm:perforce:yourp4server:1666:${p4path}</developerConnection>
      <url>perforce:yourp4server:1666:${p4path}</url>
    </scm>
    

    较新的插件不需要用户名/密码,它将使用您的有效P4凭据。

    我正在使用maven 3.2.5并且不必指定任何插件依赖项。内置的scm识别出:perforce: scm并下载了maven-scm-provider-perforce 1.9.2,这是本文撰写时的最新内容。您可以通过删除.m2 \ repository \ org \ apache \ maven \ scm中的maven-scm-provider-perforce文件夹然后执行mvn scm:status来确保您使用的是最新插件 - 它将下载缺少插件,你可以看到它选择了哪一个。

    这是我的maven-release-plugin定义:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.5.1</version>
        </plugin>
    

    我的pom中没有maven-scm-plugin定义(我使用了superpom中的默认设置)。

    1. 测试非模块项目。
    2. 您应该可以执行以下操作而不会出现错误:   - mvn scm:status检查您的scm设置是否正常运行   - mvn release:prepare   - mvn release:perform

      如果您收到错误,请回滚(mvn release:rollback),确保所有内容恢复正常,然后重新运行mvn -X以获取更多详细信息。

      就我而言,非模块化项目没有太大麻烦。

      1. 测试反应堆项目的母公司。
      2. 有些事情一开始对我来说并不明显,我发现了:

        • 当在父pom中定义时,子模块名称会附加到子模块的路径。如果您的孩子不在父母身边(在我的情况下,它在旁边),您需要重新定义孩子pom中的配置。在我的情况下,我使用的是一个属性(上面的p4path),只是改变它的值是不够的。这是违反直觉的,因为父pom通常只是一个&#34; include&#34;,我希望父定义是&#34; copy-pasted&#34;在子模块中,但在这种特殊情况下,它被修改为在复制粘贴时在scm路径的末尾包含模块名称。 [有关不在以下父目录下的模块的更多内容]

        • perforce scm插件创建临时客户端规范。这也是反直觉的,我期望scm插件使用我当前的客户端规范。相反,它会动态创建一个新的,并使用您提供的路径填充它,并将其命名为username-hostname-MavenSCM-localpath。我最初对此感到惊讶,并尝试更改它,以便通过自定义maven.scm.perforce.clientspec.name属性通过客户端规范使用,这种行为实际上是正确的。使用此临时客户端规范,插件可以限制查找更改,提交和标记到此目录。它还可以在perforce历史记录中轻松跟踪此插件所执行的操作。

        • 如果模块不在父目录下,则临时客户端规范的创建将失败。如上所述,我的模块位于父母旁边。父pom中的<module>标记使用<module>../mymodule</module>引用它们,这在eclipse中可以正常工作。 scm perforce插件包含客户端规范中的模块,方法是将模块的路径附加到父路径。由于Maven将../解析为绝对路径,因此客户端规范最终包含如下内容://perforce-path/toyour/project/C:\Path\To\Your\Project/mymodule/并且客户端规范失败。除了在我们的父母下移动我的模块之外,我找不到解决此问题的方法。由于客户端规范无效,我没有在target / checkout下签出文件。在调用mvn -X时,您将使用release:perform在控制台上获取生成的客户端规范的内容。

        故事的道德:您希望确保所有模块都位于其父目录下。当你这样做时,一切都变得简单而神奇:你可以将声明保留在父pom中,并且模块scm路径会神奇地附加模块路径。您可以使用<module>mymodule</module>来引用您的模块,这些模块可以在客户端规范中正确附加。在perforce中标记父级也会标记模块,因为它们包含在内。