Упакуйте и запустите Java-приложение с зависимостями Spring - PullRequest
5 голосов
/ 19 февраля 2009

Я создал отдельное Java-приложение, которое имеет несколько зависимостей (библиотеки Apache Commons и т. Д.), А также зависимость от среды Spring, которая, в свою очередь, имеет несколько зависимостей.

Я построил это в Eclipse, где он работает нормально. Теперь мне нужно развернуть его в рабочей среде, и поэтому я пытаюсь найти лучший способ упаковать его со всеми зависимостями, а также как даже вызвать объект (он будет вызван из командной строки).

Грубым способом было бы экспортировать мой проект в виде jar-файла, найти все зависимые jar-файлы (и их зависимости!), Скопировать их в общий каталог, написать сценарий оболочки, который включает все в пути к классам, и запустить Это. Очевидно, это кажется глупым и утомительным.

Должен ли я использовать муравья, Maven? Должен ли я упаковать все зависимые файлы Spring в один большой файл? Любые советы по работе с этим были бы полезны.

Ответы [ 10 ]

4 голосов
/ 19 февраля 2009

Развертывание Java все еще глупо и утомительно в 2009 году. Поэтому обычным вариантом является написание этого небольшого сценария. Если вы поместите все ваши JAR-файлы в один каталог (скажем, lib\), вы можете использовать общий сценарий, который автоматически создает путь к классам (см. эту запись в блоге ). Я предлагаю добавить cd /d %~dp0 в начале к cd в каталог скрипта.

Maven 2 имеет плагин, который может собрать ваше приложение в один «супер JAR» ( mvn сборка: сборка ). Это работает, если вы не используете драйвер JCC DB2 (который содержит пакеты "COM.ibm. ", которые преобразуются в com.ibm. -> ClassNotFoundException).

Последнее решение, если у вас уже есть ANT build.xml, который работает, - это распаковать все зависимые JAR-файлы и создать «super JAR» самостоятельно.

2 голосов
/ 19 февраля 2009

С Ant вы можете сделать что-то из следующего:

  1. Сгруппируйте все зависимости вместе.
  2. Упакуйте JAR-файл с вашим приложением и вставьте ссылки на зависимости в MANIFEST.MF-файл с директивой "Class-Path" внутри jar. Это должно исключить необходимость создания classpath при запуске.
  3. Соберите все вместе в архив и распространите. Должно быть достаточно запустить jar напрямую с помощью «java -jar your.jar».

Для управления вашими зависимостями вы можете использовать Ivy . Как и Maven, он может извлекать зависимости во время сборки из любых настраиваемых вами репозиториев, включая репозитории Maven или ваш личный репозиторий.

1 голос
/ 21 февраля 2009

Вся эта любовь Maven и никто не упоминает Айви? О, дорогой!

Ну вот Муравейник Плющ и вот сравнение с Maven2 . Пожалуйста, взгляните на это тоже, прежде чем идти с почти всеми, кто предлагает.

1 голос
/ 19 февраля 2009

Мы обнаружили, что лучшее решение для управления зависимостями и упаковки - использовать Maven с плагином Assembly . Это обеспечивает очень элегантное средство для упаковки ваших проектов вместе со всеми зависимостями времени выполнения и вспомогательными сценариями в бинарный дистрибутив. Одним из величайших преимуществ использования сборок является то, что можно разбить ваши проекты на отдельные компоненты в соответствии с необходимостью. Если вы используете Spring Integration, она довольно распространена, у вас есть отдельные компоненты, которые можно разделить на несколько машин. Плагин сборки позволяет настроить его в соответствии с вашими требованиями.

0 голосов
/ 25 апреля 2017

Вы также можете использовать Gradle, и вот как вы можете сделать это там:

mainClassName = "my.App"

task runnableJar(type: Jar, dependsOn: [':assemble']) {
    from files(sourceSets.main.output.classesDir)
    from files(sourceSets.main.output.resourcesDir)
    from configurations.runtime.asFileTree.files.collect { zipTree(it) }

    manifest {
        attributes 'Main-Class': mainClassName
    }
}
0 голосов
/ 17 апреля 2009

Плагин maven-assembly-plugin может быть не лучшим выбором. Вы должны взглянуть на onejar-maven-plugin, как описано здесь:

http://blog.jayway.com/2009/03/22/executable-jar-with-onejar-maven-plugin/

Это позволяет всем вашим банкам зависимостей оставаться банками, а ваш код находится в своем собственном банке. Все эти банки помещены в большую банку, которая становится исполняемой.

0 голосов
/ 21 февраля 2009

В моем сценарии сборки ANT я генерирую сценарии запуска * .bat и * .sh со списком JAR, динамически создаваемых во время сборки на основе содержимого lib dir сборки.

Например, чтобы создать список банок с соответствующими разделителями:

<path id="jar-classpath">
    <fileset dir="${build.war.dir}/WEB-INF/lib">
        <include name="**/*.jar" />
    </fileset>
</path>

<pathconvert refid="jar-classpath" targetos="unix" property="exec.classpath.unix">
       <map from="${build.war.dir}\WEB-INF\lib\" to="../lib/"/>
</pathconvert>

<pathconvert refid="jar-classpath" targetos="windows" property="exec.classpath.windows">
        <map from="${build.war.dir}\WEB-INF\lib\" to="../lib/"/>
</pathconvert>

Затем вы можете использовать значения ${exec.classpath.unix} и ${exec.classpath.windows} в сценариях вызова Java.

0 голосов
/ 21 февраля 2009

Многие ваши проблемы исчезнут, если вы сделаете свой JAR исполняемым и добавите манифест, включая ClassPath. К сожалению, вы должны сжать JAR и его зависимости вместе, но о ваших проблемах CLASSPATH позаботились.

А как насчет создания пакета OSGi? Я сам еще не изучал это, но это должно быть следующей вещью для упаковки Java-приложений. Он используется в серверах приложений, таких как Spring dm Server. Возможно, это поможет и вам.

0 голосов
/ 20 февраля 2009

Мы используем Maven 2 с m2eclipse плагином; работает довольно хорошо. Плагин имеет вид графика зависимостей, отображает конфликты и т. Д.

Теперь, если вы хотите упаковать все свои зависимости в один jar, вы можете проверить Jar Jar Links (без шуток!).

0 голосов
/ 19 февраля 2009

Вы можете использовать модуль запуска, который правильно устанавливает путь к классам. Тогда у вас будет гораздо больше возможностей для упаковки ваших JAR-файлов. Вы можете легко поместить их все в каталог, который намного чище, чем создание «ублюдочного» ueber jar ...

Одним из таких пусковых установок является commons-launcher .

...