多模块 Maven 项目中的 log4j 配置文件

2022-09-02 21:37:16

我正在研究一个多模块Maven项目,其结构如下:

war-module
jar-module

war 模块依赖于 jar 模块,并在打包后将 jar 项目添加到 webapp 的 lib 目录中。

而 war-module 和 jar-module 都使用 Apache log4j 进行日志记录,并共享相同的 log4j 配置文件 (log4j.xml),目前位于 jar-module 项目中。这个log4j.xml将被打包成jar-module.jar文件,但是,我想把它放到war包中的WEB-INF/classes目录中,而不是在jar文件中,这样用户就很容易找到这个配置文件,并在必要时修改它(如果这个文件在WEB-INF/lib/jar-module中,他们很难找到它.jar因为该目录下还有许多其他jar)。

我的问题是:Maven解决这个问题的方法是什么?

更新:

我真正的项目有点复杂,并且有一个耳朵模块也依赖于jar模块(又名jar模块可以在几个不同的项目中独立使用,我不能只是将文件放入war-module/src/main/resources目录中来解决这个问题)。我不想在几个项目中复制一些配置文件,如log4j.xml(以及其他配置文件,如myapp.properties)。


答案 1

我通过在网上进行更多的搜索找到了答案。

通常,有三种方法可以在多模块 Maven 项目中共享资源:

  • 剪切并粘贴它们。
  • 使用程序集和依赖项插件
  • 使用 maven-remote-resources-plugin

以下是Maven背后的公司Sonatype的一篇博客文章,内容涉及在Maven中的项目之间共享资源,这是我需要的确切答案:

http://www.sonatype.com/people/2008/04/how-to-share-resources-across-projects-in-maven/


答案 2

在 jar 模块中,从 jar 中排除该文件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
      <excludes>
        <exclude>log4j.xml</exclude>
      </excludes>
    </configuration>
</plugin>

使用 buildhelper 插件将 log4j.xml作为单独的工件附加到构建

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.5</version>
    <executions>
      <execution>
        <id>attach-artifacts</id>
        <phase>package</phase>
        <goals>
          <goal>attach-artifact</goal>
        </goals>
        <configuration>
          <artifacts>
            <artifact>
              <file>${project.build.outputDirectory}/log4j.xml</file>
              <type>xml</type>
              <classifier>log4j</classifier>
            </artifact>
          </artifacts>
        </configuration>
      </execution>
    </executions>
</plugin>

现在,在战争工件中,将 xml 复制到输出目录:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>copy</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>copy</goal>
        </goals>
        <configuration>
          <artifactItems>
            <artifactItem>
              <groupId>${project.groupId}</groupId>
              <artifactId>your.jar.project.artifactId</artifactId>
              <version>${project.version}</version>
              <type>xml</type>
              <classifier>log4j</classifier>
              <outputDirectory>${project.build.outputDirectory}
              </outputDirectory>
              <destFileName>log4j.xml</destFileName>
            </artifactItem>
          </artifactItems>
        </configuration>
      </execution>
    </executions>
</plugin>

但是,当然,首先将文件放在[web-artifact]/src/main/resources中会更容易:-)


推荐