如何解决父pom依赖问题:无法读取工件描述符;找不到工件?

时间:2018-09-04 20:01:05

标签: maven parent-pom

我最近向Maven Central发布了三个工件:https://search.maven.org/search?q=ced2ar3-rdb

这三个是same project的一部分,并同时发布。

我现在正尝试使用ced2ar-rdb和ced2ar-rdb-tests作为依赖项来构建新项目,但不在我的代码中引用父pom文件的位置(ced2ar3-rdb-parent;我没有确实想使用它,却不认为我需要它)。但是,当我尝试构建使用ced2ar-rdb作为依赖项的项目时,出现此错误:

[ERROR] Failed to execute goal on project ced2ar3-services-core: Could not resolve dependencies for project edu.cornell.
ncrn.ced2ar:ced2ar3-services-core:jar:0.0.0: Failed to collect dependencies at edu.cornell.ncrn.ced2ar:ced2ar3-rdb:jar:0
.0.1: Failed to read artifact descriptor for edu.cornell.ncrn.ced2ar:ced2ar3-rdb:jar:0.0.1: Could not find artifact edu.
cornell.ncrn.ced2ar:ced2ar3-rdb-parent:pom:${ced2ar.version} in central (https://repo.maven.apache.org/maven2) -> [Help   

即使<version>${ced2ar.version}</version>在文件中更下方的${ced2ar.version}中正确定义了,这个问题是否与我在父pom中拥有<properties>的事实有关?

1 个答案:

答案 0 :(得分:3)

  

这个问题与我有以下事实有关吗?   $ {ced2ar.version}在父pom中,即使   $ {ced2ar.version}似乎在进一步的定义中正确   在文件中?

不,问题出在声明子模块的方式上。
这是rdb模块pom的摘录。

<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/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ced2ar3-rdb-parent</artifactId>
        <groupId>edu.cornell.ncrn.ced2ar</groupId>
        <version>${ced2ar.version}</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ced2ar3-rdb</artifactId>

</project>

子项目的父版本中定义的${ced2ar.version}属性无法解析,除非构建反应堆项目,该项目首先构建定义此属性的父pom。这就是为什么您的构建可以在开发中(使用Reactor)工作但没有它就无法工作的原因。

使用flatten-maven-plugin解决you could use the revision standard property的问题,这将帮助您在父级和子级之间设置唯一的版本。

您的反应堆pom可能如下所示:

<project>
  <modelVersion>4.0.0</modelVersion>     
  <groupId>my-group</groupId>
  <artifactId>my-parent</artifactId>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0</revision>
  </properties>
  <modules>
    <module>rdb</module>
    <module>rdb-tests</module>
    ..
  </modules>

 <build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>flatten-maven-plugin</artifactId>
      <version>1.0.0</version>
      <configuration>
        <updatePomFile>true</updatePomFile>
      </configuration>
      <executions>
        <execution>
          <id>flatten</id>
          <phase>process-resources</phase>
          <goals>
            <goal>flatten</goal>
          </goals>
        </execution>
        <execution>
          <id>flatten.clean</id>
          <phase>clean</phase>
          <goals>
            <goal>clean</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
  </build>
</project>

例如rdb pom.xml:

<project>
  <parent>
    <groupId>my-group</groupId>
    <artifactId>my-parent</artifactId>
    <version>${revision}</version>
  </parent>

  <artifactId>rdb</artifactId>
   ...
</project>

关于您的评论:

  

我收到一个无效的POM错误,内容为:“项目名称丢失,项目   缺少描述,缺少项目URL,缺少SCM URL,开发人员   信息丢失”。确实,在检查生成的   .flattened-pom.xml,我看不到这些字段

它应为flattened plugin strips some metadata of the original POM

  

展平的POM是原始POM的简化版本,带有   集中只包含重要的消费信息。   因此,仅需要维护以下信息   开发人员和用于构建项目工件的操作被剥夺了。开始   从这里我们指定如何从   原始POM及其项目

但是您可以通过在插件的pomElements参数中添加不想删除的元素来覆盖此默认设置。
例如:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>flatten-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <updatePomFile>true</updatePomFile>
        <pomElements>
            <name/>
            <description/>
            <developers/>
            <contributors/>
            <url/>
            <scm/>
        </pomElements>                  
    </configuration>
    <executions>
        <execution>
            <id>flatten</id>
            <phase>process-resources</phase>
            <goals>
                <goal>flatten</goal>
            </goals>
        </execution>
        <execution>
            <id>flatten.clean</id>
            <phase>clean</phase>
            <goals>
                <goal>clean</goal>
            </goals>
        </execution>
    </executions>
</plugin>