协助常春藤知道具有不同组织的两个工件相同

时间:2018-09-20 17:35:33

标签: maven ant ivy

在我的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条目,因此无法识别。

1 个答案:

答案 0 :(得分:0)

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

以下配置解决了上述问题。在这里,<tosystem>定义了从外部存储库到本地(系统)名称空间的映射(包括~/.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>

上述解决方案的问题是常春藤缓存。不会使用新的名称空间定义进行更新。

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

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