简体   繁体   English

AspectJ:LTW中的ExceptionInInitializerError

[英]AspectJ: ExceptionInInitializerError in LTW

I try to complete LTW example from AspectJ Cookbook, but it doesn't work. 我尝试从AspectJ Cookbook中完成LTW示例,但是它不起作用。 I created and compiled Java class: 我创建并编译了Java类:

public class MyClass{
public void foo(int number, String name){
    System.out.println("Inside of foo");
}

public static void main(String[] args) {
    MyClass myObject = new MyClass();
    myObject.foo(1, "Str");
}
}

it works just fine: 它工作得很好:

c:\TEMP\examples>java MyClass
Inside of foo

Then I created aspect: 然后我创建了方面:

public aspect HelloWorld{
pointcut callPointcut(): call(void MyClass.foo(int, String));

before() : callPointcut(){
    System.out.println("Hello World from advice");
}
}

compiled it: 编译它:

c:\TEMP\examples>c:\tools\aspectj1.8\bin\ajc -outjar my.jar HelloWorld.aj
C:\TEMP\examples\HelloWorld.aj:4 [warning] no match for this type name:       MyClass [Xlint:invalidAbsoluteTypeName]
pointcut callPointcut(): call(void MyClass.foo(int, String));
                                   ^^^^^^^^^
    [Xlint:invalidAbsoluteTypeName]

1 warning

And then try to run: 然后尝试运行:

c:\TEMP\examples>java -classpath "C:\tools\aspectj1.8\lib\aspectjweaver.jar" "-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader" -Daj.class.path=. "-Daj.aspect.path=c:\TEMP\examples" MyClass
java.lang.ExceptionInInitializerError
        at org.aspectj.weaver.WeaverMessages.<clinit>(WeaverMessages.java:18)
        at org.aspectj.weaver.bcel.ClassPathManager.addPath(ClassPathManager.java:81)
        at org.aspectj.weaver.bcel.ClassPathManager.<init>(ClassPathManager.java:63)
        at org.aspectj.weaver.bcel.BcelWorld.<init>(BcelWorld.java:285)
        at org.aspectj.weaver.tools.WeavingAdaptor.init(WeavingAdaptor.java:176)
        at org.aspectj.weaver.tools.WeavingAdaptor.<init>(WeavingAdaptor.java:109)
        at org.aspectj.weaver.loadtime.WeavingURLClassLoader.<init>(WeavingURLClassLoader.java:75)
        at org.aspectj.weaver.loadtime.WeavingURLClassLoader.<init>(WeavingURLClassLoader.java:52)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.SystemClassLoaderAction.run(Unknown Source)
        at java.lang.SystemClassLoaderAction.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
        at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
Caused by: java.lang.IllegalStateException: recursive invocation
        at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
        at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
        at java.util.ServiceLoader.loadInstalled(Unknown Source)
        at java.util.ResourceBundle.<clinit>(Unknown Source)
        ... 17 more
Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
        at org.aspectj.weaver.WeaverMessages.<clinit>(WeaverMessages.java:18)
        at org.aspectj.weaver.bcel.ClassPathManager.addPath(ClassPathManager.java:81)
        at org.aspectj.weaver.bcel.ClassPathManager.<init>(ClassPathManager.java:63)
        at org.aspectj.weaver.bcel.BcelWorld.<init>(BcelWorld.java:285)
        at org.aspectj.weaver.tools.WeavingAdaptor.init(WeavingAdaptor.java:176)
        at org.aspectj.weaver.tools.WeavingAdaptor.<init>(WeavingAdaptor.java:109)
        at org.aspectj.weaver.loadtime.WeavingURLClassLoader.<init>(WeavingURLClassLoader.java:75)
        at org.aspectj.weaver.loadtime.WeavingURLClassLoader.<init>(WeavingURLClassLoader.java:52)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.SystemClassLoaderAction.run(Unknown Source)
        at java.lang.SystemClassLoaderAction.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
        at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
Caused by: java.lang.IllegalStateException: recursive invocation
        at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
        at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
        at java.util.ServiceLoader.loadInstalled(Unknown Source)
        at java.util.ResourceBundle.<clinit>(Unknown Source)
        at org.aspectj.weaver.WeaverMessages.<clinit>(WeaverMessages.java:18)
        at org.aspectj.weaver.bcel.ClassPathManager.addPath(ClassPathManager.java:81)
        at org.aspectj.weaver.bcel.ClassPathManager.<init>(ClassPathManager.java:63)
        at org.aspectj.weaver.bcel.BcelWorld.<init>(BcelWorld.java:285)
        at org.aspectj.weaver.tools.WeavingAdaptor.init(WeavingAdaptor.java:176)
        at org.aspectj.weaver.tools.WeavingAdaptor.<init>(WeavingAdaptor.java:109)
        at org.aspectj.weaver.loadtime.WeavingURLClassLoader.<init>(WeavingURLClassLoader.java:75)
        at org.aspectj.weaver.loadtime.WeavingURLClassLoader.<init>(WeavingURLClassLoader.java:52)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.SystemClassLoaderAction.run(Unknown Source)
        at java.lang.SystemClassLoaderAction.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
        at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)

I try different solutions and exception occurs only if I provide -Daj.aspect.path=c:\\TEMP\\examples, but as far as I understand it is because weaver will load aspect only of this option is provided. 我尝试不同的解决方案,并且仅当我提供-Daj.aspect.path = c:\\ TEMP \\ examples时,才会发生异常,但是据我了解,这是因为weaver将仅加载提供此选项的方面。 Without this option Java program works without any aspects weaved at load time. 如果没有此选项,Java程序将在加载时无任何方面的影响。

Can you use the javaagent? 可以使用javaagent吗? I feel it is simpler than modifying the class loader: 我觉得这比修改类加载器更简单:

javac MyClass.java

ajc HelloWorld.java -1.8 -outxml -d out

export CLASSPATH=.:out:$CLASSPATH

java -javaagent:$AJHOME/lib/aspectjweaver.jar MyClass
Hello World from advice
Inside of foo

The -outxml option on the ajc call is what produces the META-INF/aop-ajc.xml file in the out folder, and that is what the agent will look for to turn on weaving. 在ajc调用上的-outxml选项是在out文件夹中生成META-INF/aop-ajc.xml文件的out ,而这正是代理寻求打开编织的目的。 (That xml file will simply list the aspects to 'turn on' and optionally some extra weaver configuration) (该xml文件将仅列出要“打开”的方面,并可以选择列出一些额外的weaver配置)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM