我们通过bytebuddy开发javaagent最终要部署到springboot项目中,javaagent引入了slf4j-api包,但是没有slf4j实现类,所有报错“failed to load class”。
这时我们有两种解决思路:
1.在javaagent中实现slf4j。
2.在javaagent 中排除slf4j,具体实现留给我们监控的springboot项目。
毫不犹豫选择第二种,因为springboot一般都有slf4j的实现,如果在javaagent中也实现的话,就会产生新的错误,重复引用,报冲突。
第二种实现方式:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>junit:junit</exclude>
<exclude>org.slf4j:slf4j-api:jar:*</exclude>
</excludes>
</artifactSet>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Premain-Class>com.hupu.agent.Agent</Premain-Class>
</manifestEntries>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
总结:轻视了maven的功能,在maven打包的时候看到一大堆的日志输出,重来没有认真关注过。心理上抗拒这些繁杂的日志,导致需要花费更多的时间才能找到解决jar冲突的方法。其实日志是软件开发者有选择的打印的,是查找问题,解决问题的重要线索。
找到问题的根源才能解决问题,网上找到的答案也需要自己分析才能真正解决问题。