Java -jar: доступ к внешнему файлу конфигурации - PullRequest
9 голосов
/ 10 февраля 2010

Я хочу сделать что-то, что, как я думал, не будет трудным.

У меня есть приложение, которое я хотел бы упаковать в jar-файл, потому что у меня ~ 30 зависимостей и я хотел бы иметь возможность развернуть один файл.

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

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

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

Нет ли простого способа добиться этого?

Ответы [ 2 ]

11 голосов
/ 18 февраля 2010

Я оставлю для потомков свое решение этой проблемы.

Я думаю, что я ожидал, что java -jar сделает что-то, чего не делает.

Если вы используете обычную команду java, вы можете включить jar в classpath, и вы получите почти то же самое, что и java -jar, только вы должны указать имя класса, который хотите использовать. Это выглядит так:

java -cp .:path/to/Jar.jar com.company.package.Class arg1=val1 arg2=val2 ....

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

Вы увидите, что я включил '.' как первый элемент в classpath, что означает, что все, что находится в том же каталоге, что и jar, будет также включено в classpath. Разумеется, все, что находится внутри банки, также включено в путь к классам, поскольку сам банк также находится в пути к классам.

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

Я уверен, что это просто базовые знания по развертыванию Java, но мне почему-то не хватало.

Надеюсь, это поможет кому-то еще. Это, безусловно, сэкономило бы мне много времени, если бы кто-то смог сказать «не пытайтесь заставить работать -jar - просто используйте метод -cp» ...

5 голосов
/ 10 февраля 2010

Вам нужно добавить "." к пути к классу файла JAR, который вы создаете для своего приложения.

Итак, в манифесте я ожидал увидеть

Main-Class: some.full.Name
Class-Path: . needed-lib.jar other-lib.jar 

Затем, когда вы запустите свое приложение, выполнив

java -jar myapp.jar

фактически использует

java -classpath .;needed-lib.jar;other-lib.jar some.full.Name

Таким образом, любой файл в каталоге с файлом myapp.jar также будет находиться в пути к классам. Этот путь к классу зависит от местоположения банки, в которой он находится.

Log4j ожидает, что файл конфигурации log4j.xml находится в пути к классам. Если вы не используете имя log4j.xml, вам также необходимо добавить системное свойство в команду запуска, чтобы указать библиотеке log4j искать другое имя.

Я не уверен, что Spring ожидает от конфигурационных файлов. А загрузка файла свойств зависит от того, какой механизм используется для загрузки файла. Использование FileReader или InputStream вообще не использует механизм classpath. В этом случае вам нужно знать, где приложение ожидает, что файл будет относительно текущего рабочего каталога.

...