Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Ambiguous methods with Java 8 (but not Java 7)

Thanks Andy,

Adding an:

<exclude name="org/exist/security/PermissionRequiredAspect.java"/>

to the javac task seems to have stopped the duplicate field exception
at runtime :-)

On 2 February 2015 at 18:15, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
> I think in theory what you are doing there is fine, but some kind of bug is affecting things.
>
> You could exclude the aspect from the first compile (by javac) - that may make it behave. You could ‘exclude’ it in the first step or maybe give it a “.aj” suffix meaning javac wouldn’t notice it and then add it in your secondary step.
>
> cheers,
> Andy
>
>> On Jan 30, 2015, at 6:03 AM, Adam Retter <adam.retter@xxxxxxxxxxxxxx> wrote:
>>
>>>> Also, at present we compile our whole code-base with javac and then
>>>> use the Ant task to run iajc again over the whole codebase. I wonder
>>>> if we could just use iajc to compile those classes that actually have
>>>> Aspects? Perhaps that might work around all/some of the compile errors
>>>> we are getting?
>>>
>>> If you are rebuilding everything with iajc, that does seem a duplication of effort. You either should just build with iajc or build with javac and then binary weave the aspects into what you built with iajc. This latter approach would probably avoid this bug.  So javac your java modules. ajc your aspects and supply an inpath to that ajc call that is your javac built code, the output would be the woven form of that code.
>>>
>>
>> Thanks Andy, I am trying to take your suggestion to restrict what is
>> compiled by AspectJ. We have one Aspect in our project called
>> PermissionRequiredAspect which allows us to annotate certain methods
>> within the codebase as needing a certain security context. Previously
>> our Ant compilation looked like this -
>>
>>    <javac includeAntRuntime="false" debug="${build.debug}"
>> deprecation="${build.deprecation}" destdir="${build.classes}"
>>        encoding="UTF-8" optimize="${build.optimize}" srcdir="${src}"
>>        source="${build.compiler.source}" target="${build.compiler.target}"
>>        fork="true" memoryInitialSize="512m" memoryMaximumSize="1024m">
>>
>>        <include name="org/**"/>
>>
>>        <classpath>
>>            <path refid="classpath.core"/>
>>            <path refid="classpath.jetty"/>
>>            <path refid="classpath.aspectj"/>
>>        </classpath>
>>    </javac>
>>
>>    <iajc debug="${build.debug}" deprecation="${build.deprecation}"
>> destdir="${build.classes}"
>>        encoding="UTF-8" srcdir="${src}"
>>        source="${build.compiler.source}" target="${build.compiler.target}"
>>        fork="true" maxmem="1024m" showWeaveInfo="true">
>>
>>        <include name="org/**"/>
>>
>>        <classpath>
>>            <path refid="classpath.aspectj"/>
>>            <path refid="classpath.core"/>
>>            <path refid="classpath.jetty"/>
>>        </classpath>
>>    </iajc>
>>
>>
>> Following your suggestion to reduce the amount of compilation done by
>> iajc, I have now modified the iajc task to this:
>>
>>    <iajc debug="${build.debug}" deprecation="${build.deprecation}"
>> destdir="${build.classes}"
>>        encoding="UTF-8" srcdir="${src}"
>>        source="${build.compiler.source}" target="${build.compiler.target}"
>>        fork="true" maxmem="1024m" showWeaveInfo="true"
>> inpath="${build.classes}">
>>
>>        <include name="org/exist/security/PermissionRequiredAspect.java"/>
>>
>>        <classpath>
>>            <path refid="classpath.aspectj"/>
>>            <path refid="classpath.core"/>
>>            <path refid="classpath.jetty"/>
>>        </classpath>
>>    </iajc>
>>
>>
>> The good news is that the compilation now works with both Java 7 and
>> Java 8. The bad news however, is that at runtime when I try to use the
>> method of a class that was woven, I get this error message for
>> example:
>>
>> [junit] Caused by: java.lang.ClassFormatError: Duplicate field
>> name&signature in class file
>> org/exist/security/PermissionRequiredAspect
>>    [junit] at java.lang.ClassLoader.defineClass1(Native Method)
>>    [junit] at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
>>    [junit] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
>>    [junit] at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
>>    [junit] at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
>>    [junit] at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
>>    [junit] at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
>>    [junit] at java.security.AccessController.doPrivileged(Native Method)
>>    [junit] at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
>>    [junit] at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
>>    [junit] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
>>    [junit] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
>>    [junit] at org.exist.security.UnixStylePermission.setMode(UnixStylePermission.java:237)
>>    [junit] at org.exist.collections.Collection.setPermissions(Collection.java:1917)
>>
>> I guess there is something wrong with my compilation steps and that I
>> need to remove something from compilation at some stage? Can you
>> advise please?
>>
>> My aspect is here
>> https://github.com/adamretter/exist/blob/aspectj-updates/src/org/exist/security/PermissionRequiredAspect.java
>> and an example of where that aspect is used (via the
>> PermissionRequired annotation is here) -
>> https://github.com/adamretter/exist/blob/aspectj-updates/src/org/exist/security/UnixStylePermission.java#L234
>>
>> Thanks Adam.
>>
>> --
>> Adam Retter
>>
>> skype: adam.retter
>> tweet: adamretter
>> http://www.adamretter.org.uk
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
> https://dev.eclipse.org/mailman/listinfo/aspectj-users



-- 
Adam Retter

skype: adam.retter
tweet: adamretter
http://www.adamretter.org.uk


Back to the top