Maven - включить зависимые библиотеки в банку без распаковки зависимостей?

Мы пытаемся создать клиентскую банку, включающую распакованные зависимые банки. И в манифесте должно быть 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>

person Marcus Leon    schedule 18.11.2009    source источник


Ответы (3)


Действительно, сборка с использованием jar-with-dependencies заставляет maven распаковывать все зависимости, поскольку ${assembly.dependencySets.dependency.unpack} устанавливается в true в соответствующем дескрипторе сборки.

Простым решением было бы предоставить дескриптор сборки, аналогичный jar-with-dependencies.xml, и изменить ${assembly.dependencySets.dependency.unpack} на false, например:

EDIT: По неизвестной причине поведение при использовании <unpack>false</unpack> не совсем такое же, и кажется необходимым добавить <outputDirectory>/</outputDirectory> в набор файлов, иначе вы не получите ожидаемого результата.

<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>
person Pascal Thivent    schedule 18.11.2009
comment
Я бы еще добавил <dependencySets><dependencySet><useProjectArtifact>false</useProjectArtifact></dependencySet></dependencySets>. - person yegor256; 19.12.2010

Вы можете добавить свои зависимости в виде файлов jar в свой jar:

дескриптор-сборки.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 в путь к классам.

person dur    schedule 19.01.2016

Решение, предложенное Pascal Thivent, определяет новую сборку для подключаемого модуля сборки Maven. Плагин сборки Maven предлагает сборки по умолчанию, такие как «bin», «jar-with-dependencies», «project» и «src», создающие различные предопределенные пакеты.

Новая сборка должна быть определена в новом xml-файле, чаще всего расположенном в src/assemble. Тогда он будет загружен вместо предопределенного, вот так:

<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>
person jopasserat    schedule 28.11.2010