【问题标题】:maven release:perform with Perforce does not create target/checkout directorymaven 发布:使用 Perforce 执行不会创建目标/签出目录
【发布时间】:2014-12-21 22:00:54
【问题描述】:

我无法使 maven-release 插件与 Perforce 一起工作。 release:prepare 似乎工作正常:创建了一个 Perforce 标签,它包含正确的文件。然而,当我运行 release:perform 时它失败了,因为目标/签出目录是空的。

我做了一些实验。如果我只同步到我的 pom.xml 然后运行 mvn scm:结帐 然后我的其他文件被检出到 P4 根目录中,就像我做了一个 p4同步... 然而 Maven 输出 [INFO] 结帐工作目录:/home/chris/perforce/pips/target/checkout [信息] 同步 -f //仓库/点数/... 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:perform

时,我还会看到“Fixing checkout URL”消息

那么人们如何解决这个问题?

下面是我的 pom.xml。我在用 Perforce 服务器版本: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>

【问题讨论】:

    标签: maven perforce maven-release-plugin


    【解决方案1】:

    我在 perforce / maven / release 集成上苦苦挣扎了几天,终于让它工作了。以下是我的发现,它们可能会对您和其他有类似问题的人有所帮助。

    1. 不要使用 perforce.com 上描述的 perforce 插件 (http://www.perforce.com/perforce/r11.1/manuals/p4maven/index.html)。虽然是google搜索出来的第一个链接,但我的理解是这个插件已经过时了。

    在您的配置中,如果您引用 scm:p4:...,则您使用的是 com.perforce 插件。相反,请使用使用 scm:perforce:... 语法的 org.apache.maven.scm/maven-scm-provider-perforce。你的&lt;scm&gt; 应该是这样的:

    <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. 在非模块项目上进行测试。

    您应该能够正确执行以下操作: - mvn scm:status 检查您的 scm 设置是否正常工作 - mvn release:prepare - mvn release:perform

    如果出现错误,请回滚 (mvn release:rollback),确保一切恢复正常,然后使用 mvn -X 重新运行以获取更多详细信息。

    在我的例子中,一个非模块化项目运行起来没有太多麻烦。

    1. 在反应堆项目的父项上进行测试。

    有几件事起初对我来说并不明显,后来我发现了:

    • 在父 pom 中定义时,子模块名称会附加到子模块的路径中。如果您的孩子实际上不在父母之下(在我的情况下,它在旁边),您需要在 child pom.xml 中重新定义一个配置。在我的例子中,我使用了一个属性(上面的 p4path),仅仅改变它的值是不够的。这是违反直觉的,因为父 pom 通常只是一个“包含”,我希望父定义在子模块中“复制粘贴”,但在这种特殊情况下,它被修改为包含模块名称复制粘贴时 scm 路径的结尾。 [更多关于不位于下面父目录下的模块]

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

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

    故事寓意:您要确保所有模块都位于其父目录下。当你这样做时,一切都变得简单而神奇:你可以将声明留在你的父 pom 中,模块路径会神奇地附加到模块 scm 路径中。您可以使用 &lt;module&gt;mymodule&lt;/module&gt; 引用您的模块,该模块已正确附加在客户端规范中。 perforce 中对父级的标记最终也会标记模块,因为它们包含在其中。

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多