создание Java-приложения для одной банки - PullRequest
5 голосов
/ 28 ноября 2011

Если у меня есть проект Java, который состоит из нескольких различных типов файлов (изображений, звука и т. Д.) И нескольких зависимостей jar, каков хороший способ упаковать все это в один единственный jar, который можно просто щелкнуть дважды?

Я знаю, что банки сами по себе довольно глупы в том смысле, что они не ищут в себе файлы, от которых зависят (что я понял только после малейшего разочарования (преуменьшение)). - Если банка A зависит от классов, содержащихся в банке B, то установка банки B внутри баночки A не будет работать. Jar A должен находиться в том же каталоге, что и JAR B.

... Теперь я знаю, что могу просто извлечь все файлы из всех других jar-файлов и поместить все в один каталог. Это будет работать , но я не хочу этого делать, потому что: 1. Это было бы грязно и 2. Это все равно не решило бы проблему необходимости иметь одинаковые звуковые файлы. каталог в качестве окончательного банку. (По какой-то причине звуковые файлы работают точно так же, как и внутренние банки)

По сути, я просто хочу сделать так, чтобы файлы, от которых зависит мое приложение, не были неприятно видимыми и показными. Так что, если бы было какое-то решение, где я мог бы поместить все в банку и сделать его единственным необходимым файлом для запуска всей программы, это было бы оптимальным решением. Но я готов принять творческие / изобретательные способы, чтобы обойти проблему, такую ​​как пакетный скрипт в родительском каталоге, выполнить jar или что-то еще. (Я говорю «или что-то», потому что этот точный сценарий будет работать только на операционных системах Windows. ... вы понимаете, о чем я!)

Ответы [ 7 ]

4 голосов
/ 28 ноября 2011

Apache Maven plus плагин оттенка сделает именно то, что вам нужно.

Ознакомьтесь с плагином Shade, где в раздел MANIFEST.MF добавлен основной класс http://maven.apache.org/plugins/maven-shade-plugin/examples.html

2 голосов
/ 28 ноября 2011

Вы можете извлечь все файлы JAR и объединить их в один общий файл JAR.Есть задачи ANT и плагины Maven, доступные для этого.Кроме того, если ваше приложение написано правильно, ничто не мешает вам также помещать медиа-файлы и другие ресурсы в JAR.Вам просто нужно убедиться, что эти ресурсы " загружены из classpath ", а не загружены из текущего рабочего каталога.

1 голос
/ 28 ноября 2011

Если вы создаете исполняемый файл jar и у вас есть другие файлы jar, которые должны быть доступны в пути к классам, в файле MANIFEST.MF файла jar есть строка Class-Path:, в которой перечислены записи (включая файлы jar и каталоги) в пути к классам при запуске основного класса.

Обычно я использую свою IDE или ant для создания таких исполняемых jar-файлов и устанавливаю заголовок Class-Path:.

Кстати, чтобы сделать ваш jar исполняемым, установите строку Main-Class: в вашем файле MANIFEST.MF.

Вот пример из исполняемого файла jar:

Main-Class: com.example.app.MyAppCLI
Class-Path: log4j.jar driver.jar libraries.jar

И вот соответствующая цель муравья, чтобы построить это:

<target name="exejar">
  <jar destfile="myapp.jar"
       basedir="bin"
       include="**/app/*.class">
    <manifest>
      <attribute name="Main-Class" value="com.example.app.MyAppCLI"/>
      <attribute name="Class-Path" value="log4j.jar driver.jar libraries.jar"/>
    </manifest>
  </jar>
</target>

Если вы будете использовать такой инструмент, как ant, для создания своих исполняемых jar-файлов, это облегчит повторение процесса, а также будет обрабатывать странные крайние случаи для вас, например, что происходит, когда строка заголовка в MANIFEST.MF становится слишком долго.

1 голос
/ 28 ноября 2011

Если вы используете Maven, то я предлагаю тень или сборочные плагины.Если нет, то прочитайте это: Самый простой способ объединить релиз в один файл JAR

1 голос
/ 28 ноября 2011

Если вы используете плагин сборки для maven, вы можете загрузить его зависимости, собрать модули и создать исполняемый файл jar.

0 голосов
/ 29 ноября 2011

имеет проект java, который состоит из нескольких различных типов файлов (изображений, звука и т. Д.) И нескольких зависимостей jar, что является хорошим способом упаковать все это в один единственный jar, который можно просто дважды щелкнуть

Лучший способ развернуть многофункциональное клиентское приложение. использует Java Web Start . Конечный пользователь никогда не увидит Jar-файл и может получить ярлык на рабочем столе или пункт меню для запуска приложения.

0 голосов
/ 28 ноября 2011

Если вы используете Maven, вы можете оценить onejar-maven-plugin .Одним из основных преимуществ является то, что все ваши банки зависимостей остаются в банках, а ваш код - в своих собственных.Все эти фляги помещены в больший флягу, которая сделана выполнимой, таким образом избегая некоторых потенциальных проблем пути к классам.Прочитайте руководство по использованию и это сообщение в блоге для получения дополнительной информации.

...