Bug 253751 - waving an inner class in a different project and different package rises a IllegalAccessError
Summary: waving an inner class in a different project and different package rises a Il...
Status: RESOLVED DUPLICATE of bug 255643
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.6.1   Edit
Hardware: PC Linux
: P3 normal with 2 votes (vote)
Target Milestone: 1.6.3   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-11-04 12:44 EST by mauro CLA
Modified: 2009-07-22 01:56 EDT (History)
3 users (show)

See Also:


Attachments
2 eclipse projects higlighting the bug (2.19 KB, application/x-zip-compressed)
2008-11-04 12:44 EST, mauro CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description mauro CLA 2008-11-04 12:44:34 EST
Created attachment 116974 [details]
2 eclipse projects higlighting the bug

Build ID: M20080911-1700

Steps To Reproduce:
1.import the attached zip with import->Existing projects into workspace
2.run Caller.java

More information:
maybe related to bug 251326
Comment 1 Andrew Clement CLA 2008-12-12 13:50:53 EST
Please include the failure message when you raise a bug, it may lead to it getting diagnosed faster.  I have recreated it:

Exception in thread "main" java.lang.IllegalAccessError: tried to access class pack.AdvisedClass$InnerIterator from class otherPack.Caller
	at otherPack.Caller.main(Caller.java:9)

The problem is that AspectJ cannot do its job with the project configuration like this.  In order for Caller to access the inner type, it needs to expose it as public.  The type 'pack.AdvisedClass' is not exposed for weaving since it is in another project and only on the classpath of testproj.

There should really be a compile time error saying that AspectJ cannot modify the inner type that it needs to.

A solution to this is to alter the configuration so that the builder for testproj can see and change AdvisedClass but it isn't ideal.  If you change the testproj so that instead of just a classpath dependency on testcode, it has an inpath dependency on testcode, then it will be able to see and weave AdvisedClass - *but* the modified version of AdvisedClass will be in the bin folder of the testproj.  Caller will then run just fine.

You can't put testproj on the aspectpath of testcode (which would also allow AdvisedClass to be modified) because that creates a project dependency cycle.

Or, you could just change the visibility of the AdvisedClass.InnerIterator type from private to public - but I guess that violates the visibility you are trying to achieve.
Comment 2 mauro CLA 2008-12-12 14:13:03 EST
(In reply to comment #1)
> Or, you could just change the visibility of the AdvisedClass.InnerIterator type
> from private to public - but I guess that violates the visibility you are
> trying to achieve.

I would actually like to have a private inner class woven at loadtime...
From what I see this doesn't seem possible right?


Comment 3 Andrew Clement CLA 2008-12-12 14:45:59 EST
at loadtime you may be OK as the type will be available for the weaver to modify.
Comment 4 mauro CLA 2008-12-12 15:20:39 EST
(In reply to comment #3)
> at loadtime you may be OK as the type will be available for the weaver to
> modify.
> 

unfortunately not...

I'm trying to weave Tomcat with the following

package javax.el.aspects;
import javax.el.*;
public privileged aspect CompositeELResolver_FeatureIterator_next_NotNullReturn{
  //Checks if a method returns Null
  after() returning(Object retVal): 
      call(* *.next(..)) && target(CompositeELResolver.FeatureIterator){
    if(retVal==null){
      System.out.println("Null object returned");
    }
  }
}

where javax.el.CompositeELResolver.FeatureIterator is a private inner class

and I get the same IllegalAccessError:

12-dic-2008 21.12.11 org.apache.tomcat.util.digester.Digester startElement
GRAVE: Begin event threw error
java.lang.IllegalAccessError: tried to access class javax.el.CompositeELResolver$FeatureIterator from class org.apache.tomcat.util.digester.RulesBase
	at org.apache.tomcat.util.digester.RulesBase.match(RulesBase.java:221)
	at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1267)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:767)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1359)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1316)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
	at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1581)
	at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsDigesterSource.execute(MbeansDescriptorsDigesterSource.java:227)
	at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsDigesterSource.loadDescriptors(MbeansDescriptorsDigesterSource.java:210)
	at org.apache.tomcat.util.modeler.Registry.load(Registry.java:753)
	at org.apache.tomcat.util.modeler.Registry.loadDescriptors(Registry.java:865)
	at org.apache.tomcat.util.modeler.Registry.loadDescriptors(Registry.java:843)
	at org.apache.catalina.mbeans.MBeanUtils.createRegistry(MBeanUtils.java:1359)
	at org.apache.catalina.mbeans.MBeanUtils.<clinit>(MBeanUtils.java:99)
	at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.<clinit>(GlobalResourcesLifecycleListener.java:66)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:206)
	at org.apache.tomcat.util.digester.Rule.begin(Rule.java:153)
	at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
	at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:179)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1339)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2747)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
	at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:490)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412)
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412)
Caused by: java.lang.IllegalAccessError: tried to access class javax.el.CompositeELResolver$FeatureIterator from class org.apache.tomcat.util.digester.RulesBase
	at org.apache.tomcat.util.digester.RulesBase.match(RulesBase.java:221)
	at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1267)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:767)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1359)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1316)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
	at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1581)
	at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsDigesterSource.execute(MbeansDescriptorsDigesterSource.java:227)
	at org.apache.tomcat.util.modeler.modules.MbeansDescriptorsDigesterSource.loadDescriptors(MbeansDescriptorsDigesterSource.java:210)
	at org.apache.tomcat.util.modeler.Registry.load(Registry.java:753)
	at org.apache.tomcat.util.modeler.Registry.loadDescriptors(Registry.java:865)
	at org.apache.tomcat.util.modeler.Registry.loadDescriptors(Registry.java:843)
	at org.apache.catalina.mbeans.MBeanUtils.createRegistry(MBeanUtils.java:1359)
	at org.apache.catalina.mbeans.MBeanUtils.<clinit>(MBeanUtils.java:99)
	at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.<clinit>(GlobalResourcesLifecycleListener.java:66)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:206)
	at org.apache.tomcat.util.digester.Rule.begin(Rule.java:153)
	at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
	at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:179)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1339)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2747)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
	at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:490)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
	... 6 more


Comment 5 Andrew Clement CLA 2008-12-12 15:25:59 EST
you didnt say it was a javax.* class...

AspectJ has special rules for java.* and javax.* - they are not woven by default.

Under  https://bugs.eclipse.org/bugs/show_bug.cgi?id=149261 I added some options to allow them to be woven *if* you can get the weaver correctly associated with the classloader that loads them.  You need to try:

> <weaver options="-Xset:weaveJavaxPackages=true"/>

in your aop.xml
Comment 6 mauro CLA 2008-12-14 12:13:56 EST
(In reply to comment #5)
> You need to try:
> > <weaver options="-Xset:weaveJavaxPackages=true"/>
> in your aop.xml

wow... this should really be a FAQ
and maybe a warning from the compiler
 

Comment 7 Andrew Clement CLA 2008-12-14 12:30:06 EST

*** This bug has been marked as a duplicate of bug 255643 ***
Comment 8 mauro CLA 2008-12-14 12:34:07 EST
(In reply to comment #7)
> 
> *** This bug has been marked as a duplicate of bug 255643 ***

A you said this bug also highlights a problem in the compile time weaving:

"There should really be a compile time error saying that AspectJ cannot modify
the inner type that it needs to."
Comment 9 Andrew Clement CLA 2008-12-14 13:36:39 EST
actually, on closer examination, that comes out already.  When I import your projects into eclipse I see the warning:

warning this affected type is not exposed to the weaver: pack.AdvisedClass$InnerIterator (needed for privileged access) [Xlint:typeNotExposedToWeaver]

which is precisely the problem here.  did you not get the warning?

Whether it should be an error or a warning - different users will have different opinions.  If running the aspect immediately after then the warning should have been an error.  If just getting it compile in the IDE then running it with LTW, then a warning is fine as the code will execute OK.

It is an XLint and so the severity you care about is configurable as a project property, in the AspectJ section.  If you are regularly running inside the IDE then up the severity on that xlint to error.
Comment 10 mauro CLA 2008-12-14 13:42:59 EST
(In reply to comment #9)
> actually, on closer examination, that comes out already.  When I import your
> projects into eclipse I see the warning:
> which is precisely the problem here.  did you not get the warning?

true but I found the IllegalAccessError at runtime misleading...


Comment 11 PASTUREL CLA 2009-07-21 11:44:29 EDT
Does this bug in progress ?
I have the same issue with a Hibernate Class and a call pointcut.
I use AspectJ Version DEVELOPMENT released on Friday Jul 17, 2009.

And with LTW i get this exception (java.lang.IllegalAccessError) :
[WebappClassLoader@5060d5] weaveinfo Join point 'method-call(int org.hibernate.t
ype.ComponentType.getColumnSpan(org.hibernate.engine.Mapping))' in Type 'org.hib
ernate.type.ComponentType' (ComponentType.java:618) advised by around advice fro
m 'iep.perf.aspects.abstractAspects.AbstractCPUDurationSimpleMethodWithParentImp
l' (AbstractCPUDurationSimpleMethodWithParent.aj:80)
[WebappClassLoader@5060d5] weaveinfo Join point 'method-call(java.lang.Object[]
org.hibernate.type.ComponentType.getPropertyValues(java.lang.Object, org.hiberna
te.EntityMode))' in Type 'org.hibernate.type.ComponentType' (ComponentType.java:
622) advised by around advice from 'iep.perf.aspects.abstractAspects.AbstractCPU
DurationSimpleMethodWithParentImpl' (AbstractCPUDurationSimpleMethodWithParent.a
j:80)
[WebappClassLoader@5060d5] weaveinfo Join point 'method-call(boolean[] org.hiber
nate.type.Type.toColumnNullness(java.lang.Object, org.hibernate.engine.Mapping))
' in Type 'org.hibernate.type.ComponentType' (ComponentType.java:625) advised by
 around advice from 'iep.perf.aspects.abstractAspects.AbstractCPUDurationSimpleM
ethodWithParentImpl' (AbstractCPUDurationSimpleMethodWithParent.aj:80)
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure1'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure3'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure5'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure7'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure9'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure11'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
....
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure241'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure243'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure245'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure247'
[WebappClassLoader@5060d5] debug generating class 'org.hibernate.type.ComponentT
ype$AjcClosure249'
Initial SessionFactory creation failed. java.lang.IllegalAccessError: tried to a
ccess class org.hibernate.tuple.component.ComponentEntityModeToTuplizerMapping f
rom class org.hibernate.type.ComponentType
[JClassLoader@1551b0] debug weaving 'org.apache.log4j.spi.ThrowableInformation'
Comment 12 Andrew Clement CLA 2009-07-21 15:01:11 EDT
this bug is closed as a duplicate of 255643.  And is particularly related to weaving javax packages.  If you are seeing this problem on a version of AspectJ later than the version in which it claims to be fixed, you should reopen it - or open a new bug if you are not dealing with javax types.
Comment 13 PASTUREL CLA 2009-07-22 01:56:37 EDT
I open a new bug 284224, the IllegalAccessException occurs with a Hibernate Class