Можно ли создать «uber» jar, содержащий классы проекта и зависимости проекта в виде jar с пользовательским файлом манифеста? - PullRequest
28 голосов
/ 02 декабря 2009

Я пытаюсь создать исполняемый файл 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-plugin для создания "uber" jar, но зависимости распаковываются и добавляются как классы в мой jar.

Ответы [ 4 ]

58 голосов
/ 02 декабря 2009

На самом деле, я не проверял, что именно делает maven-shade-plugin (или любой другой плагин), так как в maven 2 есть все встроенное для создания мегаджара или уберджара. Вам просто нужно использовать плагин maven-assembly-plug с предопределенным дескриптором 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 (и получить сборку, созданную как часть обычной сборки).

6 голосов
/ 03 декабря 2009

OneJar имеет плагин maven2 .

2 голосов
/ 02 декабря 2009

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

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

0 голосов
/ 02 декабря 2009

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

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

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

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

...