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

使用AspectJ编译时织入修改Jira类未生效,求问题排查

问题:AspectJ编译时织入修改Jira类无效排查

我尝试通过AspectJ编译时织入修改com.atlassian.jira.issue.util.IssueImplAggregateTimeTrackingCalculator类修复Jira Bug,操作步骤如下:

  • 使用Atlassian SDK创建插件以获取项目所需的所有Jira依赖
  • 为IntelliJ安装AspectJ插件
  • 在pom.xml中添加AspectJ依赖及aspectj-maven-plugin插件
  • 创建com.atlassian.jira.issue.util包,放入待修改的IssueImplAggregateTimeTrackingCalculator源码类及新的CalculatorFix.aj切面类

编译项目后,将目标文件夹中的2个编译类复制到Jira实例的WEB-INF/classes目录,但类的行为未发生改变,求排查操作错误。


相关pom.xml片段

<dependencies>
    <!-- might not be necessary cuz i put aspectj to project libs -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
            <scope>compile</scope>
        </dependency>
    <dependency>
</dependencies>

<build>
    <plugins>
        <!-- for aspectj support -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>${aspectj-plugin.version}</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                    <target>1.8</target>
                    <showWeaveInfo>true</showWeaveInfo>
                    <verbose>true</verbose>
                    <Xlint>ignore</Xlint>
                    <encoding>UTF-8 </encoding>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!-- use this goal to weave all your main classes -->
                            <goal>compile</goal>
                            <!-- use this goal to weave all your test classes -->
                            <!--
                            <goal>test-compile</goal>
                            -->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        <plugin>

待修改的IssueImplAggregateTimeTrackingCalculator类

import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.jira.security.PermissionManager;
import com.atlassian.jira.security.Permissions;

import java.util.Collection;


public class IssueImplAggregateTimeTrackingCalculator implements AggregateTimeTrackingCalculator {
    private final PermissionChecker permissionChecker;

    public IssueImplAggregateTimeTrackingCalculator(final JiraAuthenticationContext context, final PermissionManager permissionManager) {
        this(new PermissionChecker() {
            public boolean hasPermission(Issue subTask) {
                return permissionManager.hasPermission(Permissions.BROWSE, subTask, context.getUser());
            }
        });
    }

    public IssueImplAggregateTimeTrackingCalculator(PermissionChecker permissionChecker) {
        this.permissionChecker = permissionChecker;
    }

    
    public AggregateTimeTrackingBean getAggregates(Issue issue) {
        // here is the code I want to modify
    }

   
    public interface PermissionChecker {
        boolean hasPermission(Issue subTask);
    }
}

切面类CalculatorFix.aj

package com.atlassian.jira.issue.util;

import com.atlassian.jira.issue.Issue;

public privileged aspect CalculatorFix {

    pointcut callGetAggregates(Issue issue,
                               IssueImplAggregateTimeTrackingCalculator issueImplAggregateTimeTrackingCalculator) :
            call(AggregateTimeTrackingBean com.atlassian.jira.issue.util.IssueImplAggregateTimeTrackingCalculator.getAggregates(Issue))
            && args(issue)
            && target(issueImplAggregateTimeTrackingCalculator);

    AggregateTimeTrackingBean around (Issue issue,
                                      IssueImplAggregateTimeTrackingCalculator issueImplAggregateTimeTrackingCalculator):
            callGetAggregates(issue, issueImplAggregateTimeTrackingCalculator) {
        throw new IllegalArgumentException("hello AspectJ world");
    }
}

问题排查与解决方案

核心错误点

  1. 类加载优先级问题:Jira默认优先加载自身核心jar包中的IssueImplAggregateTimeTrackingCalculator类,而非你复制到WEB-INF/classes的修改版。编译时织入的切面仅生效于你编译的类,但Jira实际运行时并未加载这个类。

  2. 编译时织入的局限性:aspectj-maven-plugin的compile目标仅能织入你项目内的类,无法直接修改Jira核心jar中的类字节码,这种场景下编译时织入不适用。

  3. 切面与依赖配置问题:

    • aspectjweaver的scope设置为compile错误,运行时织入需要它在runtime阶段生效,应改为runtime。
    • 切面中未导入AggregateTimeTrackingBean,会导致编译错误,切面逻辑根本没生效。
    • 切入点用call只能捕获外部调用,若Jira内部是类内方法调用,无法触发切面,应改用execution切入点。

正确操作方案

1. 改用AspectJ运行时织入(LTW)

编译时织入无法处理外部jar类,必须用运行时织入:

  • 将aspectjweaver.jar放入Jira的WEB-INF/lib目录。
  • 修改Jira启动参数,添加:-javaagent:/path/to/aspectjweaver.jar(替换为实际jar路径),确保JVM加载织入代理。
  • 创建META-INF/aop.xml配置文件,指定织入规则:
    <aspectj>
        <weaver options="-verbose -showWeaveInfo">
            <include within="com.atlassian.jira.issue.util.IssueImplAggregateTimeTrackingCalculator"/>
        </weaver>
        <aspects>
            <aspect name="com.atlassian.jira.issue.util.CalculatorFix"/>
        </aspects>
    </aspectj>
    
  • 将编译后的CalculatorFix.class和aop.xml打包成jar,放入Jira的WEB-INF/lib,无需复制修改后的IssueImplAggregateTimeTrackingCalculator类。

2. 修正切面逻辑

package com.atlassian.jira.issue.util;

import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.util.AggregateTimeTrackingBean;

public privileged aspect CalculatorFix {

    pointcut executeGetAggregates(Issue issue, IssueImplAggregateTimeTrackingCalculator calculator) :
            execution(AggregateTimeTrackingBean IssueImplAggregateTimeTrackingCalculator.getAggregates(Issue))
            && args(issue)
            && target(calculator);

    AggregateTimeTrackingBean around(Issue issue, IssueImplAggregateTimeTrackingCalculator calculator):
            executeGetAggregates(issue, calculator) {
        // 替换为你的修复逻辑
        throw new IllegalArgumentException("hello AspectJ world");
    }
}

3. 修正pom.xml依赖配置

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>${aspectj.version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectj.version}</version>
    <scope>runtime</scope>
</dependency>

内容的提问来源于stack exchange,提问作者Ignat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:14:53