Создание jav-приложения на одну банку

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

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

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

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

7 ответов

Решение

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

Apache Maven plus Shade Plugin сделает именно то, что вам нужно.

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

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

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

Если вы создаете исполняемый файл 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 становится слишком длинной.

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

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

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

Другие вопросы по тегам