【问题标题】:mvn - inject log4j.properties into maven pluginmvn - 将 log4j.properties 注入 maven 插件
【发布时间】:2025-12-30 08:55:07
【问题描述】:

我有两个项目:

  • 我制作了一个 Maven MOJO company:generation-plugin,它会生成一些代码。 Maven 阶段是generate-sources
  • 在一个客户端项目中,我使用的插件如下:

        <plugin>
            <groupId>company</groupId>
            <artifactId>generation-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    

生成项目和客户端项目在src/main/resources中都有一个log4j.properties

问题是在客户端项目中源的生成过程中,使用了生成项目的log4j.properties

是否可以将客户端项目的log4j.properties注入到生成项目中,或者换句话说,将生成项目的log4j.properties替换为log4j.properties?

更新

当生成项目的log4j.properties被移动到src/test/resources或干脆删除时,客户端项目在构建过程中得到如下警告:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

不知何故,我必须能够告诉生成项目使用来自客户端项目的 log4.properties

【问题讨论】:

  • 一种可能的解决方案是在插件的 src/main/resources 中不包含 log4j.properties。为什么你真的需要在 src/main/resources 中使用它?如果是为了测试目的,应该在 src/test/resources 里面
  • @Tunaki 我会更新我的问题。
  • 您似乎没有使用standard Mojo way 来记录消息。有什么具体原因吗?
  • @Tunaki 我会检查一下。记录的不是 MOJO 本身,而是 FreeMarker 库在记录。该插件调用 FreeMarker 功能。
  • 您的插件会将本地 src/main/resources 提取到其类路径中并因此找到 log4j.properties 是没有意义的。你对 log4j 初始化做了什么“有趣”的事情,比如将系统属性设置为“src/main/resource/log4j.properties”?你不应该。

标签: java maven log4j


【解决方案1】:

这里没有足够的信息来解决这个问题,但是这个问题隐含地要求提供一些关于 Maven 和 log4j 如何工作的信息。

  1. Maven 在执行时为每个插件创建一个单独的类加载器。该插件包含插件本身声明的依赖项(运行时+编译)。插件类加载器包含项目的目标/类;虽然一些需要检查类(用于代码修改)的插件会在里面寻找额外的麻烦。
  2. Lo​​g4j 在某些类加载器中查找 log4j.properties。 log4j 可能没有使用正确的类加载器,这取决于 log4j 和 Maven 的版本;您可以尝试将线程上下文类加载器设置为加载 mojo 的类加载器,看看会发生什么。
  3. 理论上,您可以将 log4j 桥接到 Maven mojo 日志;我找不到这样的例子,所以你可能需要自己从 log4j 文档中编写代码。

【讨论】:

  • 感谢您的信息。我会深入研究并让你知道!