Как создать артефакт JarJar с Maven, где использование артефакта не вызывает транзитивные зависимости? - PullRequest
11 голосов
/ 19 апреля 2011

В настоящее время у меня есть библиотека тестирования Java, которая построена с Maven и распространяется в виде jar-файла.Мой проект зависит от очень распространенной библиотеки (Objectweb ASM), и у меня возникли проблемы, когда более ранняя и несовместимая версия ASM уже находится в пути к классам.Таким образом, я начал использовать jarjar-maven-plugin для создания jar, переупаковывая ASM внутри, где он не может конфликтовать с другой версией ASM.

Это выполняется нормально, и моя библиотека можетбез каких-либо проблем можно использовать в качестве зависимости.

Однако, поскольку у моего проекта есть зависимости области компиляции от ASM, всякий раз, когда клиентский проект добавляет мою библиотеку, все транзитивные зависимости также включаются.Таким образом, гипотетически, если они используют определенную версию ASM, и они также добавляют версию, от которой я зависит, к пути к классам, они имеют неопределенное поведение.Я хотел бы избежать этой ситуации и позволить клиентам зависеть от артефакта JarJar, не заставляя Maven удалять ненужные и потенциально опасные переходные зависимости.

Как создать артефакт JarJar, которыйпользователи могут зависеть, не потянув транзитивные зависимости?

Ответы [ 3 ]

17 голосов
/ 20 апреля 2011

Я нашел решение этой проблемы, отказавшись от jarjar-maven-plugin и вернувшись к maven-shade-plugin.Это позволяет переупаковывать классы в вашем собственном пространстве имен, устанавливать основной класс jar и, самое главное, переписывать сгенерированный pom в not , включая зависимости времени компиляции, которые теперь связаны.

Частьмоего pom.xml, который достиг этого:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
    <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>

            <shadedArtifactAttached>false</shadedArtifactAttached>
            <createDependencyReducedPom>true</createDependencyReducedPom>

            <relocations>
                <relocation>
                    <pattern>org.objectweb.asm</pattern>
                    <shadedPattern>${repackage.base}.org.objectweb.asm</shadedPattern>
                </relocation>
            </relocations>
            <transformers>
                <transformer
                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <mainClass>${package.base}.my.MainClass</mainClass>
                </transformer>
            </transformers>
        </configuration>
    </execution>
</executions>

Важными частями этой конфигурации являются:

  • shadedArtifactAttached, которые при установке на false, означает, что затененная банка заменит основной артефакт, который обычно производится.По умолчанию используется значение false, но на это стоит обратить внимание.
  • createDependencyReducedPom, что при значении true означает, что при развертывании или установке затененного jar-файла, развернутый pom.xml не будет включать зависимости области компиляциикоторые были переупакованы в банку.
  • relocation эти элементы настраивают, как файлы внутри зависимостей переупаковываются в затененную банку.В приведенном выше примере любой класс, каноническое имя которого начинается с org.objectweb.asm, будет перемещен в ${package.base}.org.objectweb.asm, и поэтому при упаковке в банку будет иметь эквивалентный путь к файлу в банке.

С этимКонфигурация, когда мой проект развернут, когда клиенты объявляют зависимость области компиляции от моего проекта, он извлекает только затененный jar, и нет транзитивных зависимостей.

1 голос
/ 20 апреля 2011

Попробуйте вместо этого попробовать плагин maven-shade-plugin, который обеспечивает все виды точного управления.

0 голосов
/ 20 апреля 2011

Возможно, установка атрибута <optional> будет работать в вашем случае. Указав что-то вроде следующего в вашей библиотеке тестирования Java, pom.

  <dependencies>
    <dependency>
      <groupId>asm.group</groupId>
      <artifactId>asm</artifactId>
      <version>x.y</version>
      <optional>true</optional>
    </dependency>
    ...
  </dependencies>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...