Как создать исполняемый файл JAR, который использует внешние файлы JAR в динамических местах - PullRequest
2 голосов
/ 19 января 2010

Я запрограммировал приложение, которое занимает около 300 килобайт. Файлы jar, которые он использует (библиотека), занимают около 10 МГц.

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

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

Заранее спасибо!

РЕДАКТИРОВАТЬ: После обсуждения этого с добрыми людьми ниже. Теперь я использую следующую командную строку. Все еще не работает.

java -cp C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/woodstox.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/activation.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/FastInfoset.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/http.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxb-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxb-impl.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxb-xjc.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxws-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxws-rt.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxws-tools.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jsr173_api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jsr181-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jsr250-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/mimepull.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/resolver.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/saaj-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/saaj-impl.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/stax-ex.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/streambuffer.jar;C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/jmxws.jar;C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/jmxws-doctool.jar;C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/wiseman-core.jar -Dcom.MyCompany.log.directory=C:/Oracle/Middleware/user_projects/domains/MyCompany/servers/AdminServer/logs -Dcom.MyCompany.config.directory=C:/temp/Apache/Config -jar jmx2snmp.jar

Ответы [ 5 ]

3 голосов
/ 19 января 2010

Обратите внимание, что вы не можете использовать -cp и -jar одновременно. Когда вы делаете java -jar, java ожидает, что указанный файл jar будет объявлен в файле MANIFEST.MF. Я думаю, что ваша командная строка должна работать, помещая ваш jar в "cp", и явно вызывая основной класс в командной строке.

Другим решением, если вас интересует размер, является развертывание приложения с JNLP и сжатие ваших jar-файлов с помощью Pack200 .

3 голосов
/ 19 января 2010

Просто установите переменную окружения CLASSPATH так, чтобы она указывала на ваши .jar s.
Или передайте опцию -classpath в java.

Вот как это сделать под windows

2 голосов
/ 19 января 2010

Можете ли вы использовать Java Web Start для запуска приложения? Это позволит вам вывести ваши зависимости во время установки.

0 голосов
/ 19 января 2010

Если вы используете опцию -jar для запуска программы, ни переменная CLASSPATH, ни опции -cp не используются. Документация гласит:

Когда вы используете эту опцию, файл JAR является источником всех пользовательских классов, а другие параметры пути к классам пользователей игнорируются

То есть путь к классу должен быть указан в строке Class-Path: в файле MANIFEST.

Вместо использования опции -jar добавьте JAR в CLASSPATH опции -cp и используйте имя основного класса для запуска

java -cp C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/woodstox.jar;
    ...;
    C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/wiseman-core.jar;jmx2snmp.jar 
    -Dcom.MyCompany.log.directory=...
    -Dcom.MyCompany.config.directory=C:/temp/Apache/Config <package.classname>

с этим LONG classpath было бы лучше использовать переменную CLASSPATH ...

0 голосов
/ 19 января 2010

Надеемся, что путь к файлам библиотеки может быть определен системной переменной среды.

Разве не для этого предназначен CLASSPATH?

Например, я храню все соответствующие банки в $ {HOME} / jars. Мой .bashrc содержит

CLASSPATH=$(cygpath -w $HOME/jars/log4j-1.2.15.jar)
for j in $HOME/jars/*.jar
        do
        h=$(cygpath -w $j)
        CLASSPATH=$CLASSPATH\;$h
done
export CLASSPATH

Это Windows и Cygwin, Unix был бы просто похожим (и это должно быть сделано с помощью встроенных функций Windows тоже). Поэтому, если приложению нужен jar, я просто отбрасываю зависимость в jar, и следующая оболочка включит ее в путь к классам.

...