Как настроить maven для использования разных файлов log4j.properties в разных средах

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

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

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

Ответы

Ответ 1

  • в вашем проекте добавьте 3 папки:

    Ваш проект \src\main\resources\

        \A > log4j.properties
        \B > log4j.properties
        \Default > log4j.properties
    
  • в pom.xml

              По умолчанию   

    <build>
        <resources>
            <resource>
                <directory>src/main/resources/${param}</directory>           
            </resource>
        </resources>
    </build> 
    
    • if: mvn clean install: classpath = > log4j.properties(по умолчанию)

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

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

намного лучше, чем использование профилей, более расширяемо, не касаясь pom

Ответ 2

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

<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>

Ответ 3

Вам не нужен плагин 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 чистым.

Ответ 4

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

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

Итак,

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

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

Я считаю, что лучше использовать разные файлы, чем копировать ресурс.

Ответ 5

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

log4j.rootLogger=${rootLoggerLevel}, ${appender}