Maven - включить зависимые библиотеки в jar без распаковки зависимостей?
Мы пытаемся создать клиентскую банку, которая включает распакованные зависимые баночки. И манифест должен иметь записи class-path
для зависимых банок. Ниже приведен фрагмент ниже, но банки распакованы - как мы можем остановить упаковку банок?
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Ответы
Ответ 1
Действительно, сборка с использованием jar-with-dependencies
заставляет maven распаковывать все зависимости, поскольку ${assembly.dependencySets.dependency.unpack}
установлен в true
в соответствующем дескрипторе сборки.
Простым решением было бы предоставить дескриптор сборки, подобный jar-with-dependencies.xml
, и изменить ${assembly.dependencySets.dependency.unpack}
на false
, например:
РЕДАКТИРОВАТЬ: По неизвестной причине поведение при использовании <unpack>false</unpack>
не совсем то же самое, и кажется необходимым добавить <outputDirectory>/</outputDirectory>
в файлSet или вы не получите ожидаемого результата.
<assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Ответ 2
Решение, предложенное Паскалем Тивентом, определяет новую сборку для плагина сборки Maven. Плагин сборки Maven предлагает сборки по умолчанию, которые представляют собой "bin", "jar-with-dependencies", "project" и "src", производящие различные предопределенные пакеты.
Новая сборка должна быть определена в новом XML файле, большую часть времени находится в src/assembly. Затем он будет загружен вместо предопределенного, таким образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<!-- disabled predefined assembly -->
<!--
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
-->
<descriptors>
<descriptor>src/assemble/myAssembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
Ответ 3
Вы можете добавить свои зависимости в виде файлов jar в свою банку:
сборочно-descriptor.xml
<assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>.</outputDirectory>
</fileSet>
</fileSets>
</assembly>
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-uberjar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptor>src/main/assemble/assembly-descriptor.xml</descriptor>
</configuration>
</execution>
</executions>
</plugin>
Но, к сожалению, вы не можете использовать заголовок Class-Path
в manifest.mf
, см. Добавление классов в путь к классу классов JAR:
Примечание. Заголовок Class-Path
указывает на классы или файлы JAR в локальной сети, а не на файлы JAR в файле JAR или классы, доступные через интернет-протоколы. Чтобы загружать классы в файлы JAR в JAR файле в путь к классу, вы должны написать собственный код для загрузки этих классов. Например, если MyJar.jar
содержит другой JAR файл с именем MyUtils.jar
, вы не можете использовать заголовок Class-Path
в манифесте MyJar.jar's
для загрузки классов в MyUtils.jar
в путь к классу.