我不能让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>
答案 0 :(得分:2)
我在perforce / maven / release集成上奋斗了好几天,终于让它运转起来了。以下是我的发现,他们可能会帮助您和其他有类似问题的人。
在您的配置中,如果您参考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中的默认设置)。
您应该可以执行以下操作而不会出现错误:
- mvn scm:status
检查您的scm设置是否正常运行
- mvn release:prepare
- mvn release:perform
如果您收到错误,请回滚(mvn release:rollback
),确保所有内容恢复正常,然后重新运行mvn -X
以获取更多详细信息。
就我而言,非模块化项目没有太大麻烦。
有些事情一开始对我来说并不明显,我发现了:
当在父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中标记父级也会标记模块,因为它们包含在内。