AspectJ AOP LTW无法与javaagent的动态加载一起使用

这是我的示例无效项目。

它包含2个模块:

  • lib-用作lib的方面。它包含以下类

    1. 这是用于附加建议的注释
    2. 这是上述Wrap注释的定义。

  • 使用上述方面的lib

    1. 用于动态加载javaagent的类
    2. 使用Wrap注释的主类。

目录结构如下:

.

├── README.md

├── aop-app

│   ├── pom.xml

│   └── src

│   └── main

│   └── java

│   └── com

│   └── aop

│   └── app

│   ├── DynamicLoad.java

│   └── Main.java

└── aop-lib

   ├── pom.xml

   └── src

   └── main

   └── java

   └── com

   └── aop

   └── app

   └── lib

   ├── Wrap.java

   └── WrapDef.java

我正在尝试通过如官方文档中所述动态加载javaagent来通过Load

Time Weaving(LTW)aop-lib在内部使用方面lib (AOP建议库)。但这不起作用。aop-

app

以下是Wrap.java的内容

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(value = RetentionPolicy.RUNTIME)

public @interface Wrap { }

以下是WrapDef.java的内容

@Aspect

public class WrapDef {

private static final Logger logger = LoggerFactory.getLogger(WrapDef.class);

public static boolean loaded = false;

@Around("@annotation( wrapAnnotation ) && execution(* *(..))")

public Object processSystemRequest(final ProceedingJoinPoint pjp, Wrap wrapAnnotation)

throws Throwable {

logger.debug("before wrap");

Object o = pjp.proceed();

logger.debug("after wrap");

return o;

}

static {

System.out.println("Loading");

WrapDef.loaded = true;

}

public static void reportLoaded() {

System.out.println("loaded : " + loaded);

}

}

以下是Main.java的内容:

public class Main {

private static final Logger logger = LoggerFactory.getLogger(Main.class);

@Wrap

public void myFunc(){

logger.debug("inside myFunc");

}

public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {

boolean dynamicLoad = Boolean.getBoolean("dynamicLoad");

if(dynamicLoad){

Main.isAdviceClassLoaded(); //To see if WrapDef.java is loaded or not.

if(!DynamicLoad.isAspectJAgentLoaded()) {

logger.error("AspectJ Not Loaded. Existing.");

System.exit(0);

}

Main.isAdviceClassLoaded(); //To see if WrapDef.java is loaded or not.

}

new Main().myFunc();

}

private static void isAdviceClassLoaded() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

java.lang.reflect.Method m = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);

m.setAccessible(true);

ClassLoader cl = ClassLoader.getSystemClassLoader();

Object test1 = m.invoke(cl, "com.aop.app.lib.WrapDef");

boolean loaded = test1 != null;

System.out.println("com.aop.app.lib.WrapDef Loaded : " + loaded);

}

}

使用javaagentcmd行arg,它可以正常工作:

$ java -javaagent:deploy/lib/aspectjweaver-1.9.1.jar -classpath aop-app-1.0.jar:deploy/lib/* com.aop.app.Main

14:02:45.384 [main] DEBUG com.aop.app.lib.WrapDef - before wrap

14:02:45.391 [main] DEBUG com.aop.app.Main - inside myFunc

14:02:45.391 [main] DEBUG com.aop.app.lib.WrapDef - after wrap

但是,通过动态加载javaagent,它会提供以下输出:

$ java -DdynamicLoad=true -DAGENT_PATH=deploy/lib/aspectjweaver-1.9.1.jar -classpath aop-app-1.0.jar:deploy/lib/* com.aop.app.Main

com.aop.app.lib.WrapDef Loaded : false //The WrapDef is NOT loaded before JAVAAGENT is Loaded - which is correct

java.lang.UnsupportedOperationException: AspectJ weaving agent was neither started via '-javaagent' (preMain) nor attached via 'VirtualMachine.loadAgent' (agentMain)

loading javaAgent deploy/lib/aspectjweaver-1.9.1.jar

loaded javaAgent deploy/lib/aspectjweaver-1.9.1.jar //The JAVAAGENT is Dynamically Loaded - which is correct

com.aop.app.lib.WrapDef Loaded : false //The WrapDef is STILL NOT loaded even AFTER JAVAAGENT is Loaded - THIS IS THE ISSUE

15:53:08.543 [main] DEBUG com.aop.app.Main - inside myFunc

在官方的文档没有说any

classes loaded before attachment will not be

woven。但是,相反,如您在上面的输出中看到的,WrapDef该类根本没有加载。

另外,请注意,我aspectj-maven-plugin在aop-lib /

pom.xml中使用以下选项:

<outxml>true</outxml>                           //creates META-INF/aop-ajc.xml

<showWeaveInfo>true</showWeaveInfo> //supposed to create <weaver options="-showWeaveInfo"/> BUT DOES NOT WORK

<verbose>true</verbose> //supposed to create <weaver options="-verbose"/> BUT DOES NOT WORK

因此,它使用以下内容创建META-INF/aop-ajc.xml内部aop-lib-1.0.jar

<aspectj>

<aspects>

<aspect name="com.aop.app.lib.WrapDef"/>

</aspects>

</aspectj>

但与showWeaveInfo&对应的其他标签verbose未在中创建META-INF/aop-ajc.xml。这是另一件事,在这里不起作用。

如果您需要任何其他信息-我会提供。

任何帮助表示赞赏。

回答:

解释很简单:你直接在课堂上测试织造剂Main,其已被加载

你从该类附上极剂。因此,您必须避免将要编织的类过早加载。我建议您将方法myFunc()(很糟糕的名称)放入另一个类。那个怎么样?

package com.aop.app;

import com.aop.app.lib.Wrap;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Application {

private static final Logger logger = LoggerFactory.getLogger(Application.class);

@Wrap

public void myFunc(){

logger.debug("inside myFunc");

}

public static void main(String[] args) {

new Application().myFunc();

}

}

然后在您的最后一行中Main.main(..),启动您要编织的实际应用程序:

Application.main(null);

这将产生以下输出:

com.aop.app.lib.WrapDef Loaded : false

java.lang.UnsupportedOperationException: AspectJ weaving agent was neither started via '-javaagent' (preMain) nor attached via 'VirtualMachine.loadAgent' (agentMain)

loading javaAgent aop-app/target/deploy/lib/aspectjweaver-1.9.1.jar

loaded javaAgent aop-app/target/deploy/lib/aspectjweaver-1.9.1.jar

com.aop.app.lib.WrapDef Loaded : false

Loading

07:56:21.703 [main] DEBUG com.aop.app.lib.WrapDef - before wrap

07:56:21.716 [main] DEBUG com.aop.app.Application - inside myFunc

07:56:21.716 [main] DEBUG com.aop.app.lib.WrapDef - after wrap

PS:您真的认为方面库的用户在JVM命令行上指定两个属性而不是仅使用它更容易-javaagent:/path/to/aspectweaver.jar吗?无论如何,您可能有使用动态Weaver附件的理由。从某种程度上来说,我很高兴有人使用我自己不久前添加到AspectJ中的功能。;-)

以上是 AspectJ AOP LTW无法与javaagent的动态加载一起使用 的全部内容, 来源链接: utcz.com/qa/407618.html

回到顶部