Как наиболее эффективно делиться библиотекой log4j - PullRequest
1 голос
/ 03 апреля 2009

У меня есть несколько пакетных приложений командной строки Java, которые планируется развернуть как:

batch_apps
  app_1
    batch1.jar
    run_batch1.sh
  app_2
    batch2.jar
    run_batch3.sh
{...etc...}

Как лучше всего организовать пул совместно используемых библиотек - например, log4j:

batch_apps
  app_1
    batch1.jar
    run_batch1.sh
  app_2
    batch2.jar
    run_batch3.sh
  libs
    log4j.jar
    ojdbc.jar

и включить отдельные log4j.xml в собственный файл jar каждого приложения? я понимаю, что мне нужно было бы добавить 'libs' в classpath в манифестах или в run_batchX.sh (какой способ предпочтительнее?)

Мне больше всего интересно, что было бы наиболее эффективным с точки зрения производительности.

спасибо

Ответы [ 4 ]

2 голосов
/ 03 апреля 2009

Наличие каталога с общими библиотеками в корневом каталоге вашего установочного каталога - определенно правильный путь. Поскольку библиотеки libs будут загружены в память один раз, при запуске JVM это не повлияет на производительность, какое бы решение вы ни выбрали.

Я бы не стал указывать classpath в файлах jar, так как это заставило бы вас изменить ваши jar, если вам нужно переместить ваш lib dir. Редактировать скрипт намного проще.

Я бы не включил файл conf log4j в ваши файлы jar по той же причине.

1 голос
/ 04 апреля 2009

Похоже, ваши приложения не используют один экземпляр JVM. (То есть они запускаются по отдельности через 'java -jar batch1.jar' или что-то подобное.) Поэтому совместное использование файлов библиотеки .jar только экономит место на диске DISK, а не в ОЗУ.

Если приложения не совместно используют одну JVM , то простота развертывания должна иметь приоритет над дисковым пространством. (Ваше время стоит больше, чем несколько «потраченных впустую» МБ.)

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

Если бы приложения разделяли одну JVM , я бы порекомендовал параметр папки общей библиотеки.

0 голосов
/ 03 апреля 2009

Вы можете использовать механизм расширения Java. Поместите их в JAVA_HOME / lib / ext, и они будут доступны всем приложениям. Конечно, это может быть не лучшим вариантом для всех развертываний, но это, безусловно, проще.

0 голосов
/ 03 апреля 2009

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

java -jar myApp.jar

это все, что вам нужно. Я считаю, это чище, но все спорно.

Это не имеет никакого значения с точки зрения производительности, поскольку каждое приложение запускается внутри собственной JVM.

Единственным недостатком является то, что некоторые библиотеки будут присутствовать в каждом файле JAR. Хранение на HD стоит только дороже, но в наши дни, МБ довольно дешевы :-) Я торгую простотой (без внешней папки lib) и без всякой прокрутки (не помещая ваши jar-файлы в папку Java ext) в любое время по цене хранилища , Если ваше приложение не содержит террабайт библиотек, я думаю, это нормально.

Для файла конфигурации Log4j я бы поместил один файл по умолчанию в jar, но предоставил пример файла конфигурации (log4j-custom.xml.sample), который кто-то может изменить и указать в командной строке:

java -Dlog4j.configuration=log4j-custom.xml -jar myApp.jar
...