使用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"); } }
问题排查与解决方案
核心错误点
类加载优先级问题:Jira默认优先加载自身核心jar包中的
IssueImplAggregateTimeTrackingCalculator类,而非你复制到WEB-INF/classes的修改版。编译时织入的切面仅生效于你编译的类,但Jira实际运行时并未加载这个类。编译时织入的局限性:aspectj-maven-plugin的
compile目标仅能织入你项目内的类,无法直接修改Jira核心jar中的类字节码,这种场景下编译时织入不适用。切面与依赖配置问题:
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
相关产品推荐
相关产品推荐

