Как создать единый JAR-пакет со всеми необходимыми классами для запуска приложения Java? - PullRequest
2 голосов
/ 20 июля 2010

Я собираюсь развернуть приложение Java с пользовательским модулем запуска, и мне нужно, чтобы все классы, необходимые для моего приложения, были в одном файле jar, поэтому мне не нужно развертывать с ним все библиотеки Java SE.

Я думал об использовании некоторых ранее существующих задач ant для создания цели, которая рекурсивно ищет все мои файлы скомпилированных классов на предмет ее зависимостей. После того, как все зависимости будут определены, он извлечет необходимые файлы классов из своих JAR-файлов, скопирует их вместе с моими классами в выходной каталог и сделает из него один jar-файл.

Если такой вещи нет в наличии из коробки, я могу создать ее сам, но мне нужно знать, как ссылки на другие классы хранятся в файлах .class. Это может быть намного проще, если есть какая-то java-библиотека, такая как .NET Mono.Cecil / System.Reflection, которая предоставляет API высокого уровня для проверки / манипулирования Java.

Поскольку я новичок в Java, у меня возникли проблемы с поиском того, что необходимо для выполнения этих задач. Может кто-нибудь дать мне какое-то направление?

Ответы [ 4 ]

4 голосов
/ 20 июля 2010

К сожалению, вы не можете поставлять только часть Java SE - это нарушит лицензионное соглашение. Если вы используете Java SE, то должна быть доступна вся Java SE.

Самый простой способ добиться этого - использовать компилятор Ahead Of Time. Они заботятся об упаковке только тех классов, которые вам нужны, и соответствуют лицензионному соглашению JDK, предоставляя «неиспользуемые» части JDK посредством дополнительной загрузки.

Например, Excelsior JET является хорошим AOT-компилятором и будет упаковывать только те классы, которые вам нужны. Это не бесплатно для коммерческого использования, хотя проекты с открытым исходным кодом могут подать заявку на бесплатную лицензию.

В качестве альтернативы вы можете просто предположить, что у пользователя уже есть JRE, поскольку он установлен на более чем 90% настольных компьютеров, а в случаях, когда JRE недоступен, попросите установщика загрузить один для пользователя. AdvancedInstaller предлагает бесплатную версию для этого.

3 голосов
/ 20 июля 2010

После того, как все зависимости будут определены, он извлечет необходимые файлы классов из своих JAR-файлов, скопирует их вместе с моими классами в выходной каталог и сделает из него один jar-файл.

В качестве простого решения, если вы используете Eclipse IDE, вы используете следующее решение:

В свойствах проекта Java (щелкните правой кнопкой мыши):

 Export... => Export as Runnable JAR

ЭкспортированныйВ JAR будут упакованы все его зависимости.

альтернативный текст http://www.ubuntu -pics.de / bild / 97131 / selection_016_mg6IDm.png

2 голосов
/ 20 июля 2010

Вот одно предложение, которое я нашел в web :

<jar destfile="${build-abc}/abc.jar" duplicate="fail" index="true">
  <zipfileset src="${compile-lib}/demo.jar" includes="**/*.class"/>
</jar>

Это должно добавить зависимости к банке (как показано с demo.jar).Вам все еще нужно адаптировать файл манифеста, чтобы добавленные jar появлялись в пути к классам.

Это не решает проблему классов «Java SE» - вам придется связать jre в пакете установщика илизависит от существующего в целевой системе.

1 голос
/ 20 июля 2010

Вам не нужно будет развертывать классы Java SE, так как они уже есть в клиентской JRE.

Если ваши зависимости выражены обычным образом (через Maven или Ivy ), я думаю, довольно просто найти эквивалент из maven uberjar задача ... которая будет делать то, что вы хотите сделать, но более простым способом (так как она просто перепаковывает все банки в одну большую банку).

...