gradle 到 maven 的转换,在依赖项的依赖项的版本名称中解析通配符“+”?

Posted

技术标签:

【中文标题】gradle 到 maven 的转换,在依赖项的依赖项的版本名称中解析通配符“+”?【英文标题】:gradle to maven conversion, resolve wildcard "+" in version name of dependencies of dependencies? 【发布时间】:2020-06-14 22:37:25 【问题描述】:

我已经阅读了其他问题,但它们并不完全是我的问题。

我有一组目前使用 Gradle 构建的项目,我正在尝试将所有内容切换到 maven,因为项目自然是基于 Gradle,在使用“+”的工件通配符的版本控制中。 我可以在生成“BaseProject”的单个pom并转换时解决这个问题:

"projectA-1.0.+" --> "projectA-1.0.0"

而且效果很好。但我的问题是,“projectA-1.0.0”本身依赖于“projectC-1.0.+”、“projectD-1.0.+" 和 "projectE-1.0.+" 我自然会得到编译错误。 问题是每个项目都依赖于另一个项目,当然编辑所有其他项目看起来并不那么有趣。

"projectA-1.0.0"--> "projectC-1.0.+"
               \--> "projectD-1.0.+"
               \--> "projectE-1.0.+"--> "projectX-1.0.+" 
                                   \--> "projectZ-1.0.+" 

是否有任何可能的解决方案或解决方法来解决此问题?

更新 1

这是我的错误日志的图片,请注意这些提到的工件并没有直接用于我的项目中,并且我的 pom 文件中没有它们。我认为它们是我项目依赖项的依赖项。

更新 2

这里是二级依赖的部分pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>mygroup</groupId>
  <artifactId>Myartifact</artifactId>
  <version>1808.0.0</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.6.2</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>mygroup</groupId>
      <artifactId>mysecondaryartifact</artifactId>
      <version>1805.0.0+</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

用“+”解决的版本不只是在这个 pom 中,这个问题存在于从 gradle 翻译的所有依赖项中。

更新 3

正如你在依赖树中看到的那样,所有版本都被翻译成maven可理解的版本,并且它们被maven理解,但只有一部分不被maven理解。

+--- mygroup:myartifact:1808.0.+ -> 1808.0.0
|    +--- org.apache.logging.log4j:log4j-api:2.6.2
|    +--- org.apache.logging.log4j:log4j-core:2.6.2 (*)
|    +--- mygroup:mysecondaryartifactA:1805.0.0+ -> 1805.0.0 (*)    Resolves
|    +--- mygroup:mysecondaryartifactB:1805.0.+ -> 1902.0.0 (*)   Resolves
|    +--- mygroup:mysecondaryartifactC:1808.0.+ -> 1907.0.0       Resolves
|    \--- mygroup:mysecondaryartifactD:2.0.+ -> 2.0.0  Does not Resolve --> Missing artifact mygroup:mysecondaryartifactD:2.0.+
|         \--- commons-primitives:commons-primitives:1.0  

【问题讨论】:

我无法真正关注你。您想将所有项目转换为 Maven 还是仅转换其中的一部分?如果你在 Maven 中引用一个项目,Maven 会读取 POM,无论它来自 Gradle 还是 Maven。那么问题到底出在哪里呢? 是的,我想将所有项目转换为 maven,但由于我们有很多项目,我想逐步进行,例如,如果我现在有 50 个项目(projectsNo1 到 projectNo50)我想转换 projectNo35 maven 并测试所有需求,然后将所有其他项目转换为 maven。 因此,如果您将其中一个项目转换为 Maven 并在 POM 中引用其他项目,则依赖关系将通过相应的 POM 解决,而不是通过 build.gradle 文件。所以你不应该在那里看到任何+ Gradle 是否会在它生成的 POM 中写入类似 &lt;version&gt;1.0.+&lt;/version&gt; 的内容?这会很奇怪。 您的项目引用了&lt;dependency&gt; 的其他项目。每个依赖标签都转到另一个 POM,它本身有 &lt;dependency&gt; 标签。您通常可以在 Eclipse 中按 CTRL 并单击依赖项以访问该依赖项的 POM。在某个地方,你可能有这样一个版本标签&lt;version&gt;1.2.+&lt;/version&gt; 【参考方案1】:

使用 maven 5.2.1 或更高版本,有一个名为 publishtoMavenLocal 的任务,它使用版本映射器,使用该版本的 maven 发布和发布将解析位于 build\publications\ 中的已创建 pom 中插件的实际使用版本mavenjava

【讨论】:

以上是关于gradle 到 maven 的转换,在依赖项的依赖项的版本名称中解析通配符“+”?的主要内容,如果未能解决你的问题,请参考以下文章

用于依赖项的 Gradle 私有存储库

Gradle - 获取依赖项的最新发布版本

Gradle系列:深入了解Gradle和Maven的区别

如何在build.gradle之外声明存储库详细信息

将 Maven 依赖项转换为 Gradle

Gradle 无法构建具有 Docker 依赖项的 JAR