2016-01-29 63 views
1

我有一个像下面的父pom。问题与Maven属性

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.parent.pom</groupId> 
    <artifactId>parent-pom</artifactId> 
    <version>1.0.0</version> 
    <name>parentpom</name> 
    <packaging>pom</packaging> 
    <properties> 
     <parentversion>1.0.0</parentversion> 
    </properties> 
</project> 

而我的孩子pom就像。

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>com.parent.pom</groupId> 
    <artifactId>parent-pom</artifactId> 
    <version>${parentversion}</version> 
    <relativePath>../pom.xml</relativePath> 
    </parent> 
    <groupId>com.child.pom</groupId> 
    <artifactId>child-pom</artifactId> 
    <version>2.0.0</version> 
    <name>Childpom</name> 
    <packaging>pom</packaging> 
</project> 

我的文件夹结构是这样

POM测试(有根文件夹父POM) ---孩子(有孩子POM)

,当我跑MVN清洁在我的孩子安装我得到如下的异常。

ERROR] The build could not read 1 project -> [Help 1] 
ERROR] 
ERROR] The project com.child.pom:child-pom:2.0.0 (C:\Users\kk\Desktop\POM-Test\child\pom.xml) has 1 error 
ERROR]  Non-resolvable parent POM: Could not transfer artifact com.parent.pom:parent-pom:pom:${parentversion} from/to central (http://repo.maven.apache.org/ 
maven2): Illegal character in path at index 63: http://repo.maven.apache.org/maven2/com/parent/pom/parent-pom/${parentversion}/parent-pom-${parentversion}.pom 
and 'parent.relativePath' points at wrong local POM @ line 5, column 9 -> [Help 2 

为什么我无法安装此pom?

+0

使用堆栈跟踪发布完整的错误消息。发布您运行的Maven命令。也张贴您的目录结构。 – Tunaki

+0

这应该工作代码明智的,也许你的文件夹结构或文件命名根本是不正确的? – user1438038

回答

1

开始with Maven 3.2.1您可以使用属性${revision}${sha1}${changelist}如果你真的喜欢你的版本。

所以你可以使用它像这样:

<groupId>com.soebes.examples.j2ee</groupId> 
    <artifactId>parent</artifactId> 
    <version>${revision}</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>child</module> 
    </modules> 

,你可以用它在孩子的是这样的:

<modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>com.soebes.examples.j2ee</groupId> 
    <artifactId>parent</artifactId> 
    <version>${revision}</version> 
    </parent> 

    <artifactId>child</artifactId> 

现在你要调用的Maven这样的:

mvn -Drevision=1.2.3-SNAPSHOT clean package 
mvn -Drevision=1.2.3 clean package 

你可以看看full example here.。如果您需要更改版本,我会建议使用versions-maven-plugin将版本内的版本更改为您喜欢的版本(例如在您的CI解决方案中)或发布版本,您可以使用maven-release-plugin来处理此版本。对于开发,您应该使用如下内容:1.2.3.45-SNAPSHOT(强调-SNAPSHOT)以确定当前开发中。

此外,给定的<relativePath>../pom.xml</relatvePath>不需要,因为它是默认值,所以可以省略。

非常重要。如果你有一个像你所描述的结构,那么孩子应该始终具有与父母相同的版本(如果是像给出的示例那样构建多个模块)或父母(公司POM)应该是单独的项目,这也意味着单独的git库。此外,对于其他解释,请参阅此处:https://stackoverflow.com/a/35057833/296328

1

你不能有一个属性<parent>部分

Maven的需要加载其父处理构建(项目继承等)

每个项目被确定的groupId之前设置的所有属性,artifactId的和版本。在父节中,您需要设置这3个属性来明确标识父节点。

在过去所有的POM容易更新的版本,可以考虑使用release:update-versions pluginversions:set goal

编辑: 查看有关类似问题这个其他线程:Maven project version inheritance - do I have to specify the parent version?

+0

如果我使用relativePath,那么它应该理想地工作 – robin

+0

@robin它的工作与否,取决于maven版本(在旧版本上工作),因为maven不是用来支持这样的配置 – Prim