2011-01-27 11 views
4

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

У меня возникли проблемы с загрузкой ресурсов, перечисленных в пути к классам, указанному в файле манифеста 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 файл в каталоге конфигурации. Как я могу получить log4j? Другие ссылки говорят, что он просто должен быть в пути к классам, и он также явно указан в файле манифеста jar. Может ли кто-нибудь указать мне в правильном направлении?

Update:

Вот фактические данные из Class-Path:

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

ответ

12

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

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

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

this.xml = Thread.currentThread().getContextClassLoader() 
      .getResourceAsStream("/config/configuration.xml"); 
+0

Ключи в каталоге, являющиеся папками, были ключом! Это также заставило log4j забрать файл конфигурации. Благодаря! Я бы упаковал его в банку, но мы хотели бы иметь возможность редактировать конфигурацию после того, как программа сидит на лабораторном компьютере. – Collin

3

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

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

this.xml = this.getClass().getResourceAsStream("/config/configuration.xml"); 
+0

Никакой радости от конфигурации xml .. Я добавил сами записи классов к вопросу, являются ли они неправильными? – Collin

1

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

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

См http://logging.apache.org/log4j/1.2/manual.html под "Default Initialization процедуры".

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

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

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

0

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

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

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

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

org.apache.log4j.xml.DOMConfigurator 

для файлов XML.

Смежные вопросы