我对Maven不太熟悉,我昨天开始使用它,但我喜欢它。在我的项目中,我使用 Log4j2 库进行日志记录,并且由于高级插件(如appender,转换器)的不足,我需要使用自定义插件。 log4j-api
和log4j-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
答案 0 :(得分:7)
我认为问题源于将依赖项打包到jar中。快速浏览代码,看起来插件处理器会覆盖它处理的每组插件的插件dat文件。我的猜测是,在打包过程中,处理自定义插件并将其写入dat文件,然后在处理log4j依赖项以包含在包中时覆盖。可能有更好的解决方案,但我不建议您执行以下操作之一:
不要将依赖项打包到jar中。只需打包项目,然后在执行时将依赖项包含在类路径中。即使您想将所有内容打包在一个便携式jar中,执行此操作也可以至少确认您的插件是否被覆盖,或者是否存在其他错误。
为自定义插件创建一个单独的项目,将其与主项目分开打包,然后将生成的jar包含为依赖项。与选项1一样,请确保您不在此包中包含log4j jar。一旦你创建了自定义插件jar,就可以将它与主jar中的其他依赖项一起打包,它应该可以正常工作,因为你的自定义插件jar将有自己的插件dat文件。
答案 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文件,即包含所有插件。