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

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

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

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

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

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

- Это не простой способ достичь этого?

2 ответов


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

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

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

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

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

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

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

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

Я надеюсь, что это поможет кому-то еще. Это, безусловно, сэкономило бы мне много времени, если бы кто-то смог сказать: "не беспокойтесь, пытаясь заставить работать - банку-просто используйте-CP метод"...


вам нужно добавить "."к пути к классу файла 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-файл также будет в classpath. Этот путь к классам относительно местоположения jar, содержащего его.

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

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