Подтвердить что ты не робот

Айви: как удалить транзитивные зависимости?

Я использую Ivy для управления зависимостями моего проекта.

До сих пор я указывал зависимость от Hibernate и servlet-api. Однако сам hibernate имеет множество зависимостей, которые действительно не нужны, например jaas и JACC.

Это становится шоу-пробкой, потому что jaas и jaac являются библиотеками Sun, и поэтому их лицензии запрещают размещать их в репозиториях Maven, поэтому Айви не может их найти.

  • Как заставить Ivy загружать Hibernate, но не эти два?
  • В качестве бонуса, если бы я действительно нуждался в них и скачал их Jars from Sun, в какой папке на моей машине была бы Айви искать их?
4b9b3361

Ответ 1

Как заставить Ivy загружать Hibernate, но не эти два?

Ivy делает это, используя то, что он называет "конфигурациями". Ваш ivy.xml, представляющий Hibernate, должен будет предоставить различные конфигурации, чтобы представлять различные варианты использования для спящего режима. (Очевидно, что есть использование спящего режима, которое требует jaas и jacc, но, видимо, вы не используете этот случай.)

Здесь - документация по конфигурациям. Если вы хотите предоставить ivy.xml, который вы используете для спящего режима, я могу предоставить указатели на создание конфигураций, которые удалят определенные библиотеки, которые вы хотите удалить.

Если бы я действительно нуждался в этих файлах и загружал их Jars from Sun, в какой папке на моей машине Ivy искал бы их?

"Каталоги", которые плющ просматривает для плющ файлов и артефактов, указаны в списке используемых вами распознавателей. Список разрешителей указан в файле настроек плюща (обычно называемом ivysettings.xml.) Обычно это не локальные каталоги, а удаленные URL-адреса. Там есть; тем не менее, тип распознавателя локального файла, который будет работать для этого.

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

Вот пример распознавателя локального файла из файла настроек плюща:

<filesystem name="myfiles" checkconsistency="false" checksums="" transactional="false">
   <ivy pattern="/data/repo/[organisation]/[module]-[revision].ivy.xml"/>
   <artifact pattern="/data/repo/[organisation]/[module]-[revision].[ext]"/>
</filesystem>

Также обратите внимание, что вам нужно будет указать ваши плющ-задачи правильному распознавателю. Вы можете сделать это с помощью атрибута resolver в задачах ant или с атрибутом defaultResolver в элементе settings в файле настроек плюща.

Здесь - документация по распознавателям.

РЕДАКТИРОВАТЬ: OP обнаружил менее продолжительное временное решение для своей конкретной оригинальной проблемы. "Исключить" дочерний тег тега зависимостей сделал для него работу:

<dependencies>  
   <dependency org="org.hibernate" name="hibernate-core" rev="3.3.1.GA" conf='..'> 
       <exclude name='jaas' /> 
       <exclude name='jacc' />
   </dependency>
</dependencies>

Ответ 2

Другой вариант не загружать зависимости - это отключить их с помощью атрибута transitive. Поэтому, если вы хотите hibernate-core, но ни одна из его зависимостей, вы можете сделать это:

<dependencies>  
   <dependency org="org.hibernate" name="hibernate-core"
               rev="3.3.1.GA" conf='..'
               transitive="false" /> 
</dependencies>

Ответ 3

Просмотр веб-страниц и блогов, я нашел следующие плющ-настройки для работы с захватом jaas/jacc и hibernate

<ivysettings>

<settings defaultResolver="chained" checkUpToDate="true" />

<resolvers>
    <chain name="chained">
        <url name="com.springsource.repository.bundles.release">
            <ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
            <artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
        </url>

        <url name="com.springsource.repository.bundles.external">
            <ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
            <artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
        </url>

        <ibiblio name="ibiblio" m2compatible="true"/>

        <ibiblio name="jboss" root="http://repository.jboss.org/maven2/" m2compatible="true"/>

        <ibiblio name="java-net-maven1" root="http://download.java.net/maven/1" pattern="${java.net.maven.pattern}" m2compatible="false"/>

        <ibiblio name="java-net-maven2" root="http://download.java.net/maven/2/" m2compatible="true"/>

        <ibiblio name="compass" m2compatible="true" root="http://repo.compass-project.org" />

    </chain>

</resolvers>

Решатель jboss ibibilio - вот что сделал трюк при захвате JAAS/JAAC

Затем мой ivy.xml может вытащить его с помощью

<ivy-module version="2.0">

<info organisation="foo" module="Bar"/>
<dependencies>

    <dependency org="com.h2database" name="h2" rev="1.2+"/>

    <dependency org="org.hibernate" name="hibernate-annotations" rev="3.4.0.GA"/>     

</dependencies>

Ответ 4

Чтобы ответить на ваш второй подзапрос буквально, который никто не делал до сих пор, "в какой папке на моей машине Ivy будет искать JAR?" Это зависит. Предполагая, что вы не изменили местоположение в файле ivysettings.xml или другом файле конфигурации: для JAAS, это будет: (пользовательский дом)/. ivy2/cache/javax.security/jaas/jars. Если Айви уже безуспешно пытался найти JAAS в Maven Central или другом репо, это дерево каталогов должно уже существовать по большей части, и все, что вам нужно сделать, это создать каталог "jars" и поместить jaas-1.0.01.jar. Айви больше не будет жаловаться на недостающую зависимость в следующем вызове.

РЕДАКТИРОВАТЬ: Затем снова см. обсуждение ниже, чтобы увидеть, как это сделать не так.

((пользовательский дом) является C:/Users/(имя пользователя) в Windows 7).