Log4j2自定义插件 - 使用Maven Assembly Plugin进行注释处理

时间:2014-07-31 17:43:10

标签: java maven annotations log4j maven-assembly-plugin

我对Maven不太熟悉,我昨天开始使用它,但我喜欢它。在我的项目中,我使用 Log4j2 库进行日志记录,并且由于高级插件(如appender,转换器)的不足,我需要使用自定义插件log4j-apilog4j-core(还有一堆其他库)作为依赖项添加到与我的项目关联的 pom.xml 中。实际上我使用的是Log4j的2.0版本。

Log4j使用注释处理来预加载标记为@Plugin的类。据我所知,在旧版本的log4j中,必须在 pom.xml 中指定其他插件条目以触发插件处理,或者必须在{{1}中键入包含自定义插件的软件包配置文件中的属性(https://logging.apache.org/log4j/2.x/manual/configuration.html#ConfigurationSyntax)。但是从2.0-rc2开始就不支持。

在v2.0中,只要packages可用于构建引擎,就应该自动完成。 myproject-0.0.1-SNAPSHOT.jar / META-INF / org / apache / logging / log4j / core / config / plugins / 中有一个文件 Log4j2Plugins.dat 包含我的自定义插件的映射 - 没关系。

对于使用Maven构建我也使用Maven Assembly Plugin。其目标log4j-core绑定到single阶段。打包项目后,我自然在目标目录中有一个额外的jar - myproject-0.0.1-SNAPSHOT-jar-with-dependencies.jar 。但是,此jar中的 Log4j2Plugins.dat 文件包含原始插件的映射,与log4j-core库中的文件相同。这就是问题所在,因为它没有对我的自定义插件进行任何引用。似乎来自 myproject-0.0.1-SNAPSHOT.jar 的文件正在被log4j库中的原始文件覆盖,但我不确定是什么情况。

因此,当我运行 myproject-0.0.1-SNAPSHOT-jar-with-dependencies.jar 时,log4j无法从我的项目中找到插件类。我认为 myproject-0.0.1-SNAPSHOT.jar 运行正常,但我无法在没有依赖项的情况下运行它。

配置中的package属性应该在2.0.1版本中重新启用,但如果我不想等待发布,我必须使用注释处理方法。

你知道如何解决它吗?


我尝试使用log4j的发行版 2.0-rc1 运行它,其中配置元素的packages属性可用。结果是: log4j成功加载了我的自定义插件的类。但是,还有很多其他错误(在此特定版本中出现)使程序更加无法使用。

这是一个很好的观点,它确保了如果在下一版本2.0.1中启用packages属性,我的插件工作。应根据此问题跟踪恢复该问题:https://issues.apache.org/jira/browse/LOG4J2-741


添加了 pom.xml

packages

2 个答案:

答案 0 :(得分:7)

我认为问题源于将依赖项打包到jar中。快速浏览代码,看起来插件处理器会覆盖它处理的每组插件的插件dat文件。我的猜测是,在打包过程中,处理自定义插件并将其写入dat文件,然后在处理log4j依赖项以包含在包中时覆盖。可能有更好的解决方案,但我不建议您执行以下操作之一:

  1. 不要将依赖项打包到jar中。只需打包项目,然后在执行时将依赖项包含在类路径中。即使您想将所有内容打包在一个便携式jar中,执行此操作也可以至少确认您的插件是否被覆盖,或者是否存在其他错误。

  2. 为自定义插件创建一个单独的项目,将其与主项目分开打包,然后将生成的jar包含为依赖项。与选项1一样,请确保您不在此包中包含log4j jar。一旦你创建了自定义插件jar,就可以将它与主jar中的其他依赖项一起打包,它应该可以正常工作,因为你的自定义插件jar将有自己的插件dat文件。

  3. 祝你好运!

答案 1 :(得分:4)

Log4j 2 issue 673中提到了另一种解决方案。将maven shade plugin与特定变换器一起使用,而不是maven assembly plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.4.3</version>
  <configuration>
    <transformers>
      <transformer implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer" />
    </transformers>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>com.github.edwgiz</groupId>
      <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
      <version>2.6.1</version>
    </dependency>
  </dependencies>
  <executions>
    <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
    </execution>
  </executions>
</plugin>

如果我准确理解,变换器通过正确合并来自所有依赖项的Log4j2Plugins.dat和主jar来创建Log4j2Plugins.dat文件,即包含所有插件。