2012-05-14 4 views
2

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

Пример: баночка-файл находится в /opt/myapp/test.jar

[email protected]:/opt/myapp$ java -jar test.jar 

отлично работает, но когда я пытаюсь это:

[email protected]:~$ java -jar /opt/myapp/test.jar 

Я получаю сообщение об ошибке, что log4j.xml Не может быть найдено. Это потому, что он ищет его в моем текущем рабочем каталоге.

У меня также есть файл свойств, который я использую в своем приложении. Этот файл находится в каталоге config /, где находится jar-файл, поэтому/opt/myapp/config в этом примере. Такая же проблема, как и выше, возникает при попытке загрузить файл конфигурации.

Как я могу позволить Java загружать файл из каталога, в котором находится jar-файл (независимо от того, где выполняется банка)?

Возможно что-то очень легко, но я не могу понять :(

+1

Вы можете использовать абсолютный путь? Также вы выполняете свой код в среде IDE? – buymypies

+0

Возможный дубликат файла [Fetch из определенного каталога, в котором размещен файл jar] (http://stackoverflow.com/questions/6247845/fetch-file-from-specific-directory-where-jar-file-is-placed) –

ответ

0
  1. Укажите с помощью системы log4j свойство, добавьте это до этого "-jar" часть команды: -Dlog4j.configuration =/опт/MyApp/log4j.xml

  2. Добавить каталог в Путь к классам, добавьте это до этого "-jar" часть команды:

    -cp/опт/MyApp/

  3. Вы можете указать log4j.xml вручную в коде, а затем ссылаться на него относительно вашего файла jar.

    Строка путь = ...; PropertyConfigurator.configure (путь);

+0

Третий вариант казался самым легким. – EsTeGe

1

Вам нужно передать файл с помощью параметра командной строки -Dlog4j.configuration =/путь/к/файлу.

Проверить the manual, если вам нужно больше вариантов.

0

самый надежный способ сделать это, чтобы спросить JVM, где байт-код для данного класса пришли.

См http://www.exampledepot.com/egs/java.lang/ClassOrigin.html для этого надреза домашнее животное:

// Get the location of this class 
Class cls = this.getClass(); 
ProtectionDomain pDomain = cls.getProtectionDomain(); 
CodeSource cSource = pDomain.getCodeSource(); 
URL loc = cSource.getLocation(); // file:/c:/almanac14/examples/ 

При загрузке изнутри JAR вам нужно выполнить дополнительную постобработку.

0

Try:

java cp /opt/myapp/someohter.jar -jar /opt/myapp/test.jar 

Используйте свойства, чтобы задать себе, где искать конфигурационные файлы, за ресурсы и такие (как Пауло указал) ,

Как правило, это плохая идея разместить такие файлы рядом с файлом jar.file и выполнить выполнение в зависимости от места, откуда вы начинаете. Часто каталог, в котором установлено приложение (баннер), защищен от записи для пользователей, но файлы конфигурации становятся доступными для редактирования.

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