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

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

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

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

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

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

Разве нет ли простого способа достигнуть этого?

9
задан Joel 9 February 2010 в 21:17
поделиться

2 ответа

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

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

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

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

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

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

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

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

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

11
ответ дан 4 December 2019 в 13:01
поделиться

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

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

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

5
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: