Maven属性的问题

时间:2016-01-29 10:54:00

标签: java maven

我有一个如下的父母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>
    <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>

我的孩子就像。

<?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-test(具有父pom的根文件夹)   ---孩子(有孩子pom)

当我在我的孩子中运行mvn clean install时会得到如下的异常。

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?

2 个答案:

答案 0 :(得分:1)

您不能在<parent>部分

中拥有该媒体资源

Maven需要在处理构建之前加载父级来设置所有属性(对于项目继承等)

每个项目都由groupId,artifactId和version标识。在父节中,您需要设置这3个属性以明确标识父节点。

要在所有pom上轻松更新版本,请考虑使用release:update-versions pluginversions:set goal

修改 请参阅另一个关于类似问题的帖子:Maven project version inheritance - do I have to specify the parent version?

答案 1 :(得分: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