Возможно ли создать "uber" jar, содержащую классы проекта и зависимости проекта как банки с пользовательским файлом манифеста?

Я пытаюсь создать исполняемый банку (используя maven), который содержит классы проекта и его зависимости с файлом манифеста, который содержит запись для основного класса и запись пути к классу, которая указывает на зависимости, упакованные в корневой каталог из фляги, что-то вроде этого:

Файл манифеста:

.....
Main-Class : com.acme.MainClass
Class-Path : dependecy1.jar dependecy2.jar
.....

Jar:

jar-root
|-- ....
|-- com/acme/../*.class
|-- dependecy1.jar
`-- dependecy2.jar

Я использую maven-jar-plugin для создания файла манифеста и плагина maven-shade для создания "uber" jar, но зависимости распаковываются и добавляются как классы в мою банку.

Ответ 1

На самом деле, я не проверял, что именно делает maven-shade-plugin (или любой другой плагин), так как maven 2 имеет все встроенное приложение для создания мегакара или uberjar. Вам просто нужно использовать maven-assembly-plugin с предопределенным дескриптором jar-with-dependencies.

Просто добавьте этот фрагмент в свой pom.xml, чтобы настроить манифест:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

И следующая команда создаст ваш uberjar:

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

Но опять-таки поведение по умолчанию этого дескриптора заключается в распаковке зависимостей (например, maven-shade-plugin). Честно говоря, я не понимаю, почему это проблема, но если это действительно не то, что вы хотите, вы можете использовать свой собственный пользовательский дескриптор сборки.

Для этого сначала создайте дескриптор сборки, скажем src/assembly/uberjar.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>

Затем настройте плагин maven-assembly-plugin для использования этого дескриптора и добавьте зависимости к записи Class-Path манифеста:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <descriptors> 
      <descriptor>src/assembly/uberjar.xml</descriptor>
    </descriptors>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
        <addClasspath>true</addClasspath>
      </manifest>
    </archive>
  </configuration>
  <!--
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
  -->
</plugin>

Наконец, запустите mvn assembly:assembly, чтобы создать ваш uberjar.

Необязательно, раскомментируйте элемент executions, чтобы связать плагин сборки с фазой package (и иметь сборку, созданную как часть обычной сборки).

Ответ 3

Я использовал FatJar для этого в прошлом. http://fjep.sourceforge.net/

Я создал относительно простое приложение, клиенту захотелось дважды щелкнуть по исполняемому файлу и заставить его работать. Установщиков или зависимостей не может быть и речи. Fatjar собрал библиотеки проектов и файлы с адресами из Eclipse в несколько мегабайтных исполняемых банку для меня. Безупречный.

Ответ 4

Я знаю два продукта, которые делают это:

  • Один называется "bigjar", но это слишком общий термин для использования в поиске Google; Я не смог его найти.
  • Другой называется "onejar". Там немало ссылок на него, и он утверждает, что делает то, что вам нужно.

Здесь сообщение от кого-то, кто использует OneJar в сборке Maven:

http://5341.com/list/55/498657.html