【问题标题】:Assist Ivy to know that two artifacts with distinct org are the same帮助 Ivy 知道两个组织不同的工件是相同的
【发布时间】:2019-02-25 01:54:12
【问题描述】:

在我的 Ivy 项目中,不同的传递依赖依赖于同一个包:javassist。不幸的是,打包程序与org 定义不一致(Maven 术语中的groupId)。例如:

  • 版本 3.5.GA 有 org="org.jboss",
  • 版本 3.12.GA 有 org="javassist"
  • 版本 3.13.GA 有 org="org.javassist"

Ivy 不会将这些识别为相同的依赖项,并检索所有版本。

问题:指示 Ivy 使用上述 org 定义的 javassist 包引用相同依赖项的最佳方法是什么?

更新

我添加了 Ivy 文件的简化版本来说明疑问 *ivy.xml

<ivy-module version="2.0">
  <info organisation="org.myorg" module="mymodule" revision="latest"/>
  <dependencies>
    <dependency org="org.hibernate" name="hibernate-core" rev="5.2.16.Final" force="true"/>
    <dependency org="org.jboss" name="jboss-retro" rev="1.1.0" force="true"/>
  </dependencies>
</ivy-module>

*ivysettings.xml

<ivysettings>
  <settings defaultResolver="mychain"/>
  <caches>
    <cache name="mycache" defaultTTL="1d"/>
  </caches>
  <resolvers checkModified="true">
    <chain name="mychain" cache="mycache">
      <ibiblio name="myreleases" m2compatible="true" usepoms="true" root="https://repo.local/release/"/>
      <ibiblio name="mysnapshot" m2compatible="true" usepoms="true" root="https://repo.local/snapshot"/>
     </chain>
  </resolvers>
</ivysettings>

以下是Ivy生成的dependency tree

Dependency tree for org.myorg.mymodule
+- org.hibernate#hibernate-core;5.2.16.Final
|  +- org.jboss.logging#jboss-logging;3.3.1.Final
|  +- org.hibernate.javax.persistence#hibernate-jpa-2.1-api;1.0.0.Final
|  +- org.javassist#javassist;3.22.0-GA
|  +- antlr#antlr;2.7.7
|  +- org.jboss.spec.javax.transaction#jboss-transaction-api_1.2_spec;1.0.1.Final
|  +- org.jboss#jandex;2.0.3.Final
|  +- com.fasterxml#classmate;1.3.0
|  +- dom4j#dom4j;1.6.1
|  \- org.hibernate.common#hibernate-commons-annotations;5.0.1.Final
|  |  +- org.jboss.logging#jboss-logging;3.3.1.Final
|     \- org.jboss.logging#jboss-logging;3.3.0.Final
\- org.jboss#jboss-retro;1.1.0
|  +- jboss#jboss-backport-concurrent;2.1.0.GA
|  +- org.jboss#javassist;3.5.GA
|  \- org.apache.ant#ant;1.7.0
|     \- org.apache.ant#ant-launcher;1.7.0

注意hibernate-core 依赖于org.javassist#javassist;3.22.0-GA,而jboss-retro 依赖于org.jboss#javassist;3.5.GA。两者都是相同依赖项的不同版本。但是,Ivy 无法识别,因为它们有不同的 org 条目。

【问题讨论】:

  • 能否将您的 ivy.xml 和 ivysettings.xml 添加到问题中?

标签: maven ant ivy


【解决方案1】:

我用namespaces 解决了这个问题。这些是基于正则表达式的不同 orgmodulerev 到通用命名的映射。

以下配置解决了上述问题。这里,&lt;tosystem&gt; 定义了从外部存储库到本地(系统)命名空间(包括位于 ~/.ivy2/cache 的本地 Ivy 缓存)的映射。

<namespace name="mynamespace">
  <rule>
    <fromsystem/>
    <tosystem>
      <src org="org.jboss" module="javassist"/>
      <src org="javassist" module="javassist"/>
    <dest org="org.javassist" module="javassist"/>
    </tosystem>
  </rule>
</namespace>

上述解决方案的问题在于 Ivy 缓存。它不会使用新的命名空间定义进行更新。

在示例中,从下载的 POM 文件生成的 jboss-retro 的 ivy 文件仍然将 org.jboss#javassist 列为依赖项,因为在下载时名称空间映射没有到位。此外,由于 POM 文件不会在外部存储库中更改,因此缓存不会失效。

到目前为止,重新生成 ivy 文件的替代方法是手动删除受新规则影响的缓存条目(这不是微不足道的),或 clean the whole cache(可能需要很长时间才能重新创建)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2011-04-08
    • 2011-09-07
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多