Помогите Айви узнать, что два артефакта с разными оргами одинаковы - PullRequest
0 голосов
/ 20 сентября 2018

В моем проекте Ivy разные транзитивные зависимости зависят от одного и того же пакета: javassist .К сожалению, упаковщик не соответствует определению org (groupId в терминах Maven).Например:

  • версия 3.5.GA имеет org = "org.jboss",
  • версия 3.12.GA имеет org = "javassist"
  • версия 3.13.У GA есть org = "org.javassist"

Ivy не идентифицирует их как одну и ту же зависимость и извлекает все версии.

Вопрос: как лучше всего проинструктировать Ivy о том, чтоПакеты javassist с любым из приведенных выше определений org ссылаются на одну и ту же зависимость?

ОБНОВЛЕНИЕ

Я добавил упрощенные версии файлов 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 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.Оба являются разными версиями одной и той же зависимости.Однако Айви не может идентифицировать это, поскольку у них разные записи org.

1 Ответ

0 голосов
/ 25 сентября 2018

Я решил проблему с пространствами имен .Это сопоставления на основе регулярных выражений различных org, module и rev с общим именованием.

Следующая конфигурация устранила проблему выше.Здесь <tosystem> определяет отображение из внешнего репозитория в локальное (системное) пространство имен (включая локальный кеш Ivy в ~/.ivy2/cache).

<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,Он не обновляется новым определением пространства имен.

В примере файл ivy для jboss-retro, созданный из загруженного файла POM, по-прежнему перечисляет org.jboss#javassist в качестве зависимости, поскольку сопоставление пространства имен не былона месте, когда он был загружен.Более того, поскольку файл POM не изменяется во внешнем репозитории, кэш не становится недействительным.

Пока что альтернативы для регенерации файла ivy либо вручную удаляют записи в кэше, на которые влияетновое правило (которое не является тривиальным) или для очистки всего кэша (что может занять много времени для воссоздания)

...