我最近向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>
的事实有关?
答案 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>