Если вы используете maven, обычно вы помещаете log4j.properties под java или ресурсы?

128

Куда мне поместить файл log4j.properties при использовании обычных каталогов Maven?

user496949
источник
6
src / test / resources - потребитель вашего артефакта установит уровни ведения журнала, необходимые для развертывания. Однако я бы порекомендовал slf4j, если вы делаете это для коммерческой работы. Это дает возможность переключать платформы ведения журнала при развертывании. slf4j.org
Дэвид Виктор
2
Кстати, если вы просто хотите поэкспериментировать, можно использовать log4j без файла конфигурации properties / xml. Из « logging.apache.org/log4j/1.2/manual.html - Конфигурация» «Вызов метода BasicConfigurator.configure создает довольно простую настройку log4j». Также смотрите: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… maven.apache.org/plugins/maven-resources-plugin/examples/…
Дэвид Виктор

Ответы:

141

src/main/resources это "стандартное размещение" для этого.

Обновление: приведенное выше отвечает на вопрос, но это не лучшее решение. Ознакомьтесь с другими ответами и комментариями по этому поводу ... вы, вероятно, не отправите свои собственные свойства ведения журнала вместе с jar, а вместо этого оставите его клиенту (например, серверу приложений, среде сцены и т.д.), чтобы настроить желаемое ведение журнала. Таким образом, это src/test/resourcesмое предпочтительное решение.

Примечание. Говоря о том, чтобы оставить конкретную конфигурацию журнала клиенту / пользователю, вам следует подумать о замене log4jна slf4jв своем приложении.

Ян Галински
источник
Я обнаружил, что директория ресурсов не создается. Нужно ли мне это делать вручную?
user496949
3
Ага. Вручную создайте resourcesи log4j.propertiesв папке, указанной в ответе.
Nishant
@ user496949: файлы ниже src/main/resourcesбудут скопированы по умолчанию вtarget/classes
splash
17
Если вы не собираетесь экспортировать настройки log4j как часть своего артефакта - гораздо лучше поместить его в src / test / resources
Дэвид Виктор
1
@FerasOdeh, чтобы исключить его из сгенерированных артефактов (jar, войны и т. Д.) И использовать только во время тестирования: «Если вы не собираетесь экспортировать настройки log4j как часть вашего артефакта».
Али Шакиба,
60

Просто поместите его src/main/resourcesвнутрь артефакта. Например, если ваш артефакт представляет собой JAR, у вас будет log4j.propertiesфайл внутри него, потеряв исходную точку, позволяющую настраивать ведение журнала.

Я обычно вставляю его src/main/resourcesи настраиваю выводить на цель так:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Кроме того, чтобы log4j действительно его увидел, вы должны добавить выходной каталог в путь к классу. Если ваш артефакт представляет собой исполняемый JAR-файл, вы, вероятно, использовали maven-assembly-plugin для его создания. Внутри этого плагина вы можете добавить текущую папку JAR в путь к классу, добавив Class-Pathзапись в манифесте, например:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Теперь файл log4j.properties будет находиться рядом с вашим файлом JAR, настраиваемый независимо.

Чтобы запустить приложение непосредственно из Eclipse, добавьте resourcesкаталог в путь к классам в конфигурации запуска: Run->Run Configurations...->Java Application->Newвыберите Classpathвкладку, выберите Advancedи перейдите в свой src/resourcesкаталог.

Золтан
источник
2
другой вариант - поместить его в src / test / resources, чтобы он не был связан.
rogerdpack 05
Вот это да. Спасибо за это. Это как раз то, что мне нужно!
blissfool
@ Zoltán, мне сложно добавить выходной каталог в путь к классам, как вы советовали. Есть ли способ сделать это вручную, например, зайти в файл .classpath конкретного проекта и добавить туда этот выходной каталог log4j, чтобы log4j мог видеть файл .properties после того, как приложение было связано с файлом .war. Кроме того, тег targetPath, следует ли использовать значение как есть ${project.build.directory}или его следует изменить на фактический путь, по которому проект живет на моем локальном диске?
Ирети
26

Некоторые «интеллектуального анализа данных» объясняют это src/main/resourcesтипичным местом.

Результаты поиска Google Code :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215
всплеск
источник
4
Чем этот ответ отличается от того, который был дан 20 минут назад? И resourcesнет resource, если я правильно помню.
Nishant
6
@Nishant: ничем не отличается, потому что, когда я открыл поле ответа, я вышел из ПК. Вернувшись и ответив на вопрос, я пропустил, что на вопрос уже был дан ответ. resourceбыла всего лишь опечатка.
всплеск
1
Я бы посоветовал почитать maven, плагин компилятора maven, соглашения о компоновке проектов maven. Может быть, посмотрите, что попадает под «цель» при создании вашего артефакта. Тогда, возможно, вы могли бы изменить свой ответ.
Дэвид Виктор
4
Правильный ответ - src / xxx / resources - это не соглашение. См .: maven.apache.org/plugins/maven-resources-plugin/examples/… - здесь xxx может быть основным или тестовым. Если вы не хотите предоставлять предварительно настроенные уровни ведения журнала, как правило, разумнее настроить ведение журнала в соответствии с требованиями тестирования - через 'src / test / resources' - и позволить потребителю вашего артефакта установить уровень ведения журнала.
Дэвид Виктор
22
Результаты Google по запросу "Jump from a bridge": 18.200.000. Результаты Google по запросу «Не прыгайте с моста»: 137.000
djjeck
9

Ресурсы, используемые для инициализации проекта, предпочтительно помещать в папку src / main / resources . Чтобы включить загрузку этих ресурсов во время сборки, можно просто добавить записи в pom.xml в проект maven в качестве ресурса сборки.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

Другие файлы .properties также могут храниться в этой папке, используемой для инициализации. Для фильтрации установлено значение true, если вы хотите иметь некоторые переменные в файлах свойств папки ресурсов и заполнять их из файлов свойств фильтров профиля, которые хранятся в src / main / filters, который установлен как профили, но это совсем другой вариант использования , Пока вы можете игнорировать их.

Это отличные плагины ресурсов maven , они полезны, просто просмотрите и другие разделы.

опустошитель
источник
Если вы просто скопируете и вставите приведенный выше фрагмент кода maven, обратите внимание, что это </resources> </build>
rdesilva
6

Помещение файлов ресурсов в другое место - не лучшее решение, которое вы можете использовать:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

Например, когда файлы ресурсов (например, jaxb.properties) попадают глубоко внутрь пакетов вместе с классами Java.

Али Шакиба
источник
1

Если ваш файл log4j.properties или log4j.xml не найден в src / main / resources, используйте этот PropertyConfigurator.configure ("log4j.xml");

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);
ethemsulan
источник
0

Добавьте приведенный ниже код из тегов ресурсов в свой pom.xml внутри тегов сборки. это означает, что теги ресурсов должны быть внутри тегов сборки в вашем pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Чалла Пурушотам
источник