Как вы программно «относительный импорт» каталог файлов JAR? - PullRequest
1 голос
/ 20 января 2012

Я использую Drools Planner, который поставляется с 21 файлом Jar в каталоге binaries.Например, drools-core-5.3.0.Final.jar даст org.drools.someClasses.

Включенные примеры запускают его в командной строке, выполнив комплексную команду:

mainClasspath=
for i in binaries/*.jar; do mainClasspath=${mainClasspath}:$i; done

mainClass=org.drools.planner.examples.app.DroolsPlannerExamplesApp
$JAVA_HOME/bin/java -Xms256m -Xmx512m -server -cp ${mainClasspath} ${mainClass} $*

Я разрабатываю программу в командной строке.Но конечное приложение (которое просто добавляет интерфейс HTTP) выполняется в контейнере JSP, а не из командной строки.Поэтому мне нужно программно импортировать файлы jar в мой проект.

Вопрос : Как программно импортировать файлы jar?

Я скорее должен указать путь binaries в переменной среды?


Обновление

Я сделал это, чтобы сообщить Java, что глобально, дополнительные классы могут быть найдены в том же каталоге,означает . и /home/jesvin/dev/drools/binaries.Обратите внимание, что : является разделителем в Linux.

declare -x CLASSPATH='.:/home/jesvin/dev/drools/binaries' 

Вы можете сделать это для каждого экземпляра выполнения согласно Ответ Miserable Variable .

Наконец, в развертывании Tomcat я предоставляю ему HTTP-интерфейс, развертывая егосогласно ответу havexz .

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Если банки должны быть в глобальной области видимости:

Хорошо, если вы хотите, чтобы эти jar-файлы были доступны для всех приложений на сервере, попробуйте добавить их в

`<tomcat_install_dir>/lib`

РЕДАКТИРОВАТЬ: @Geoffery комментарий: Если у вас есть доступ к

<tomcat_install_di>/conf/catalina.properties

тогда вы можете добавить свои собственные обычные банки, например:

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.base}/your_common_jar_folder/*.jar

(внимательно посмотрите в конце, я добавил новую папку)

Но в любом случае, если банки должны быть в глобальном масштабе, они должны находиться в любой из вышеперечисленных папок. В противном случае вы должны поставить другие общие jar-файлы для регистрации, jdbc и т. Д. С каждым приложением.

Если банки должны находиться в области применения

И если вы хотите, чтобы в этих банках использовалось только одно конкретное приложение, поместите их в

`<your_web_app>/WEB-INF/lib`

Примечание: вы можете поместить <your_web_app>/WEB-INF/lib вашей папки для разработки, и если вы используете правильные инструменты, она сделает эти файлы jar частью вашего .war файла.

SIDE ПРИМЕЧАНИЕ: Поскольку вы запускаете java-программу также из командной строки и у вас возникают проблемы с добавлением jar-файлов зависимостей. Некоторое время назад Я написал сценарий оболочки для этой цели, надеюсь, это вам тоже поможет.

Небольшой фрагмент:

Run Java easily from shell command

Usage: easyrunjava [-c <jar_name/jar_dir>,<jar_name/jar_dir>...] [-m <email_id1>,<email_id2>...] [-p <prop_file1>,<prop_file2>...] class_name [args_to_program]

Example:
`easyrunjava -p .,./dependency -m user.name@xyz.com com.example.HelloWorld`
2 голосов
/ 20 января 2012

Вы пытаетесь поместить все банки в папку в classpath?import - неверное слово.

Более новые версии java допускают '*' как classpath:

$JAVA_HOME/bin/java -Xms256m -Xmx512m -server -cp 'binaries/*' ${mainClass} $*

должно работать.Примечание binaries/* заключено в одинарные кавычки, чтобы предотвратить расширение оболочки.

...