Andrew
Andrew

Reputation: 334

AspectJ: ExceptionInInitializerError in LTW

I try to complete LTW example from AspectJ Cookbook, but it doesn't work. I created and compiled Java class:

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. Without this option Java program works without any aspects weaved at load time.

Upvotes: 0

Views: 234

Answers (1)

Andy Clement
Andy Clement

Reputation: 2560

Can you use the 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. (That xml file will simply list the aspects to 'turn on' and optionally some extra weaver configuration)

Upvotes: 2

Related Questions