You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:39:04