Исполняемый JAR & Ant - PullRequest
       22

Исполняемый JAR & Ant

1 голос
/ 06 сентября 2011

Я впервые пишу файл Ant build.xml для исполняемого JAR-файла, и я озадачен тем, что мне нужно включить в JAR-файл.

Проект может состоять из следующих элементов:

  1. Исходный код
  2. Горстка JAR-файлов зависимостей
  3. Файл конфигурации Spring (XML) для IoC через ClassPathXmlApplicationContext

Вот мой вопрос: так как это исполняемый JAR-файл, я должен также JAR-файл для всех JAR-зависимостей или я должен хранить их отдельно? Я подозреваю, что мне нужно включить их в JAR, и если это правда, что будет рекомендовано лучшими методами для организации моего JAR?

Вот моя первая попытка:

MyExecutableJARProgram.jar/
    META-INF/
        ...
    com/
    lib/
    config/

Где com/ - мой пакет верхнего уровня, lib/ - это каталог, содержащий все эти зависимости, а config/ содержит необходимые файлы XML.

(1) Есть мысли?

Кроме того, в качестве дополнительного вопроса, поскольку файл JAR будет иметь структуру каталогов, отличную от структуры моего проекта Eclipse, мне нужно каким-то образом настроить путь к классу для моего JAR-файла (так что он знает, например, поиск по lib/ для его зависимости), а также указание, где искать мой Spring XML-файл.

(2) Как мне настроить это в JAR - файле манифеста? Должен быть какой-то способ настроить файл манифеста (или каков ответ на этот вопрос) через Ant, поэтому я не могу не нужно вручную редактировать JAR каждый раз, когда я создаю.

Спасибо за любой вклад!

1 Ответ

1 голос
/ 06 сентября 2011

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

Так что для какого-то нетривиального проекта ваш макет дистрибутива может выглядеть так:

[apphome]
  +-- bin
        +-- command1.sh / .bat  (to supply -Xmx etc)
        +-- command2.sh / .bat
            ...
  +-- lib
        +-- module1.jar
        +-- module2.jar
            ...
        +-- command1.jar (manifest cp contains modules, 3rd party, main-class)
        +-- command2.jar
            ...
  +-- deps
        +-- 3rdparty1.jar
        +-- 3rdparty2.jar
             ...
...