Загрузка файла конфигурации из пути к классам - PullRequest
4 голосов
/ 27 января 2011

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

У меня проблемы с загрузкой ресурсов, перечисленных в classpath, указанном в файле манифеста jar.

Структура папок выглядит следующим образом:

/MyProgram.jar
/lib/<dependencies>
/config/configuration.xml

Я не могу на всю жизнь получить доступ к файлу configuration.xml с помощью ClassLoader. Он вместе со всеми зависимостями явно указан в записи пути к классу файла манифеста.

Я пробовал много вариантов следующего:

this.xml = Thread.currentThread().getContextClassLoader()
                 .getResourceAsStream(xmlName);

this.xml = this.getClass().getResourceAsStream(xmlName);

С xmlName в качестве строки всех следующих значений:

"config/configuration.xml"
"configuration.xml"
"config.configuration.xml"

В связи с этим у меня также есть файл log4j.properties в каталоге config. Как я могу получить log4j, чтобы забрать его? Другие ссылки говорят, что он просто должен быть в пути к классам, и он тоже явно указан в файле манифеста jar. Может ли кто-нибудь указать мне правильное направление?

Обновление:

Вот фактические записи из Class-Path:

Class-Path: <snip dependencies> config/configuration.xml config/log4j.properties

Ответы [ 4 ]

13 голосов
/ 28 января 2011

Записи Classpath должны быть либо каталогами, либо файлами jar, а не отдельными файлами. Попробуйте изменить путь к классу, чтобы он указывал на каталог конфигурации, а не на отдельные файлы конфигурации.

this.xml = Thread.currentThread().getContextClassLoader()
             .getResourceAsStream("config.xml");

Еще лучше было бы просто включить ваш каталог конфигурации в MyProgram.jar. Это избавит вас от необходимости добавлять его специально к пути к классам.

this.xml = Thread.currentThread().getContextClassLoader()
             .getResourceAsStream("/config/configuration.xml");
3 голосов
/ 27 января 2011

Насколько я знаю, log4j.xml должен находиться в корне вашего пути к классам.

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

this.xml = this.getClass().getResourceAsStream("/config/configuration.xml"); 
1 голос
/ 28 января 2011

При запуске приложения вы можете использовать системное свойство log4j.configuration:

java -Dlog4j.configuration=config/log4j.properties MyApp

См. http://logging.apache.org/log4j/1.2/manual.html в разделе «Процедура инициализации по умолчанию».

Что касается других файлов конфигурации, которые не были выбраны, как выглядит ваш файл Manifest.mf? Используете ли вы что-то вроде

Class-Path: config/configuration.xml lib/yourLibOne.jar lib/blah.jar

в вашем файле Manifest.mf?

0 голосов
/ 28 августа 2013

Относительно log4j: если вы хотите, чтобы он использовал файл конфигурации, отличный от файла по умолчанию, вы можете использовать

org.apache.log4j.PropertyConfigurator.configure(...)

Варианты этого статического метода принимают URL, Свойства или имя файла.

Существует также

org.apache.log4j.xml.DOMConfigurator

для файлов XML.

...