我有一个多模块 Maven 项目。模块 A 有一个注释处理器,模块 B 在其 pom.xml 中依赖于模块 A。模块 B 还有一个 src/main/resources/META-INF/services/javax.annotation.processing.Processor 文件,其中包含模块 A 中注释处理器的名称。
整个项目使用 slf4j 作为日志记录外观(因此我可以使用 @Slf4j 注释任何类并在代码中调用 log.info)。
我在 src/main/resources 下还有一个 log4j2.xml 文件,它记录到控制台。到目前为止,我的项目已按预期编译并运行。
现在,当我将 Kafka Appender 添加到 log4j2.xml 并使用如下所示的标签时,问题就出现了:
<Configuration status="info">
<Appenders>
<Kafka name="KafkaAppender" topic="123"
syncSend="false">
<JSONLayout locationInfo="true" properties="true" charset="ISO-8859-1" compact="true">
<KeyValuePair key="profile" value="1"/>
<KeyValuePair key="service" value="2"/>
<KeyValuePair key="server" value="1234"/>
</JSONLayout>
<Property name="bootstrap.servers"
value="9092"/>
<Property name="client.id"
value="1223"/>
</Kafka>
</Appenders>
<Loggers>
<Logger name="org.apache.kafka" level="WARN"/> <!-- avoid recursive logging -->
<Root level="INFO">
<AppenderRef ref="KafkaAppender"/>
</Root>
</Loggers>
</Configuration>
当我之后执行“mvn clean install”时,出现以下错误:
[ERROR] Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider MyProcessor could not be instantiated
我研究了可能导致此问题的原因,我注意到如果仅删除
<JSONLayout>
标签(而不是整个 <Kafka>
标签),项目编译时不会出现错误。
我也尝试使用
<JSONTemplateLayout>
而不是 <JSONLayout>
,但得到了相同的原始错误。
知道这里会发生什么吗?
备注:
-我的项目需要模块 A 中的注释处理器
-我的项目需要 @Slf4j 作为日志记录门面
更新 1:似乎为
<Kafka>
标签指定任何类型的布局都会触发该错误。 <CSVLayout> <GelfLayout> <HTMLLayout>,
等也无法编译。所以问题似乎不在于 <JSONLayout>
或 <JSONTemplateLayout>
。
由于为
<Kafka>
标记指定任何布局都会触发错误,因此问题不应该与特定布局类型有关,而应与包含这些布局如何影响注释处理类路径或资源加载有关。
不过,您可以暂时删除模块 B 对模块 A 的依赖,看看问题是否仍然存在。这可以帮助确认问题是否与注释处理器和日志记录配置之间的交互直接相关。
确保模块 B 中的
META-INF/services/javax.annotation.processing.Processor
文件正确引用模块 A 中的处理器类,并且不存在拼写错误或格式问题。
还可以考虑创建一个最小版本的注释处理器来记录其初始化过程。这可以帮助确定处理器是否正在加载,但在初始化期间由于缺少依赖项或类路径问题而失败。并增加 Maven 构建的详细程度 (
mvn clean install -X
),以获得更详细的日志,这些日志可能指出问题的确切原因。
public class MyProcessor extends AbstractProcessor {
public MyProcessor() {
super();
// Minimal logging to confirm instantiation
System.out.println("MyProcessor instantiated");
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// Processor logic here
return true;
}
}
检查您的 log4j2: