AspectJ织入:如何构建包含已织入依赖的带依赖jar包
织入产物存储位置
aspectj-maven-plugin在配置<weaveDependencies>对第三方依赖织入时,不会修改本地Maven仓库的原始jar包,而是直接将织入完成的第三方类输出到当前项目的编译输出目录target/classes下,和项目自身的编译类存放在一起。
问题原因
你遇到的切面不生效是因为maven-assembly-plugin打包时,会同时将本地仓库的原始spark依赖jar和target/classes下的内容合并到最终jar中,同名类加载时优先读取依赖jar里的未织入版本,导致织入后的类被覆盖。
解决方案
方案1:修改assembly插件配置,排除原始的织入目标依赖
既然织入后的spark类已经在target/classes中,只要在打包时排除本地仓库的原始spark依赖即可,修改assembly插件的配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>be.example.aspectj.App</mainClass> </manifest> </archive> <!-- 新增排除配置 --> <excludes> <exclude>org.apache.spark:spark-core_2.12</exclude> <exclude>org.apache.spark:spark-sql_2.12</exclude> </excludes> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
方案2:替换为maven-shade-plugin打包(更推荐)
shade插件默认优先使用项目本地编译目录的类覆盖依赖中的同名类,还可以自动处理你日志中出现的META-INF资源重复问题,配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>be.example.aspectj.App</mainClass> </transformer> <!-- 处理重复的META-INF资源 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/NOTICE</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/LICENSE</resource> </transformer> </transformers> <!-- 过滤冲突的签名文件避免运行报错 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
使用shade插件时可以直接移除原来的maven-assembly-plugin配置。
内容的提问来源于stack exchange,提问作者Jérôme Fink
相关产品推荐
相关产品推荐

