Я надеюсь делать что-то, что я думал, не был трудным.
У меня есть приложение, которое я хотел бы упаковать как банка, потому что у меня есть ~30 зависимостей, и я хотел бы иметь возможность развернуть единственный файл.
У меня есть некоторые конфигурационные файлы - файл свойств и пружинный конфигурационный файл и мой файл опор log4 - что я хотел бы иметь внешний к банке. Я предполагаю, что ожидал, что, если бы я поместил их в тот же каталог как банка, это нашло бы их, когда это работало, но это не делает.
При разработке у меня есть эти файлы в корне пути к классу для моего проекта затмения, и приложение находит их очень хорошо. Я чувствую, что пропускаю некоторый ключевой аспект банки / теория пути к классу...
таким образом, то, что я хочу, должно быть в состоянии поместить файлы конфигурации, и банка в том же каталоге и иметь приложение находят файлы конфигурации, когда я выполняю его со стандартным Java - вещь банки.
Разве нет ли простого способа достигнуть этого?
Я сохраню для потомков свое решение этой проблемы.
Думаю, возможно, я ожидал, что 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» ...
Вам нужно добавить "." к пути к классам файла 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 вообще не использует механизм пути к классам. В этом случае вам нужно знать, где приложение ожидает, что файл будет находиться относительно текущего рабочего каталога.