Ответ 1
Я нашел решение этой проблемы, отбросив плагин jarjar-maven и вернувшись к плагину maven-shade. Это позволяет переупаковывать классы в пределах вашего собственного пространства имен, устанавливая основной класс банки и, в решающей степени, переписывая сгенерированный pom, чтобы не включать в себя связанные с компиляцией временные зависимости, которые теперь включены.
Часть моего 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 означает, что когда развернутая или установленная затененная банка развернута, развернутый pom.xml не будет включать зависимостей области компиляции, которые были переупакованы в банку. -
relocation
Эти элементы определяют, как файлы в зависимостях переупаковываются в затененную банку. В приведенном выше примере любой класс, каноническое имя которого начинается сorg.objectweb.asm
, будет перемещен в${package.base}.org.objectweb.asm
, и, таким образом, если в банке будет упакован эквивалентный путь к файлу в банке.
В этой конфигурации при развертывании моего проекта, когда клиенты объявляют зависимость от компиляции в моем проекте, она только тянет затененную банку и не имеет транзитивных зависимостей.