Как настроить maven для использования разных файлов log4j.properties в разных средах - PullRequest
20 голосов
/ 03 марта 2012

Я хочу использовать разные конфигурации log4j для разных сред.

В моей среде разработки я хочу использовать log4j.properties (A). Но когда я собираю Maven для производственной среды, я хочу использовать log4j.properties (B).

Подскажите, пожалуйста, как настроить это в моем pom.xml?

Ответы [ 6 ]

11 голосов
/ 03 марта 2012

Вы можете использовать профили для достижения желаемого поведения:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <executions>
                <execution>
                    <id>log4j</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>output_directory</outputDirectory>
                        <resources>
                            <resource>${log4j.file}</resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <log4j.file>path_to_file_A</log4j.file>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <log4j.file>path_to_file_B</log4j.file>
        </properties>
    </profile>
</profiles>
5 голосов
/ 01 октября 2015
1. in your project add 3 folders : 

  Your Project\src\main\resources\

            \A > log4j.properties
            \B > log4j.properties
            \Default > log4j.properties
2. in pom.xml         

       <properties>
                <param>Default</param> 
        </properties>

        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/${param}</directory>           
                </resource>
            </resources>
        </build> 

3. 

 - if : mvn clean install : classpath => log4j.properties(Default)

 - if : mvn clean install  -Dparam=A : classpath => log4j.properties(A)

 - if : mvn clean install  -Dparam=B : classpath => log4j.properties(B)


> much better than using profiles is more extensible without touching the pom
2 голосов
/ 02 апреля 2014

В некоторой степени вы можете ссылаться на переменные среды внутри log4j.properties, чтобы добавить поведение, зависящее от среды. например

log4j.rootLogger=${rootLoggerLevel}, ${appender}
2 голосов
/ 28 марта 2013

Вам не нужен плагин maven-resources-, если у вас простая среда.

В этом примере log4j.properties B - это файл, который вы используете для производства, и он находится в каталоге src/main/java, а log4j.properties A - это файл, который вы используете для разработки, и он находится в каталоге /Users/junger/.m2/.

В вашем pom.xml:

<properties>
    <log4j.properties.directory>src/main/java</log4j.properties.directory>
</properties>

<build>
    <resources>
        <resource>
            <directory>${log4j.properties.directory}</directory>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Теперь в вашем /Users/junger/.m2/settings.xml (создайте его, если он не существует):

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <log4j.properties.directory>/Users/devuser/.m2/</log4j.properties.directory>
        </properties>
    </profile>
</profile>

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

1 голос
/ 03 марта 2012

Самый простой способ для меня,

  • Определить системную переменную ENV и установить ее значение _dev для вашей разработки env.
  • Где вы используете этот файл, используйтекак этот log4j $ {ENV} .properties

Итак,

В производстве он просто использует log4j.xml и для вашего разработчика log4j_dev.xml

  • Во избежание проблем было бы лучше создать также переменную ENV для производства как _pro, так что для производства log4j_pro.xml, для dev будет использоваться log4j_dev.xml.

Я считаю, что полагаться на файлы, отличные от копирования, - это лучшая практика.

0 голосов
/ 14 сентября 2018

Существует очень простое решение, подходящее для небольших проектов с jar упаковкой (я не проверял его на war упакованных проектах).Единственным недостатком является то, что вы должны дублировать все ресурсы, но если ваш единственный ресурс - log4j.properties, это не проблема.

Если у вас есть дерево каталогов, подобное этому:

log4j.properties maven profile project structure
...

enter image description here

Вы должны иметь следующую помпу:

<build>
    <finalName>${project.artifactId}</finalName>
    <sourceDirectory>src/</sourceDirectory>
    <resources>
        <resource>
            <directory>${resources.path}</directory>
        </resource>
    </resources>
</build>

<profiles>
    <profile>
        <id>default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <resources.path>resources/prod</resources.path>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <resources.path>resources/dev</resources.path>
        </properties>
    </profile>
</profiles>

Тогда при использовании dev используется профиль log4j.properties из resources/dev.Если вы используете какой-либо другой профиль или вообще не используете его, тогда используется log4j.properties из resources/prod.Поэтому ваш *.jar должен выглядеть следующим образом:

log4j.properties maven profile project jar directory structure
Конечно, если у вас другое расположение ресурсов, например main/java/resources/..., вы должны указать его вместо resources/...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...