Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Usage question

I have a question about the proper usage of the <iajc> ant task, as well as a (possible) bug report. I'm using AspectJ 1.7.1.

In my project I have a bunch of normal Java code and one custom aspect.

I also have other pre-compiled aspects supplied in 3rd party JAR files (e.g., Spring's @Transactional, etc.).

I'm doing compile-time weaving.

So the steps I have been following are:
  1. Compile normal *.java code using <javac> into build/classes
  2. Compile aspects *.aj code using <iajc> into build/classes
  3. Apply aspects (both my own and 3rd party) using <iajc>
Here's the problem: <iajc> was intermittently failing to weave classes. And each time I ran the build, it would be a different set of classes.

The classes that failed to weave would have the "this affected type is not exposed to the weaver" warning emitted during weaving (step #3). The classes warned (and not woven) would change each build.

Here is how ant was being used when this problem was occurring (abbreviated for clarity):

<!-- Define iajc.classpath: where to find classes that might be seen during iajc compile -->
<path id="iajc.classpath">
    <path refid="javac.classpath"/>
    <pathelement location="build/classes"/>
</path>

<!-- Define aspect.classpath: where to find pre-compiled AOP aspects -->
<path id="aspect.classpath">
    <path refid="javac.classpath"/>
    <pathelement location="build/classes"/>
</path>

<!-- Compile custom aspects -->
<iajc srcdir="src/java"
      destDir="build/classes"
      classpathRef="iajc.classpath"
      source="1.6"
      target="1.6"
      verbose="true"
      showWeaveInfo="true"
      failonerror="true">
        <include name="**/*.aj"/>
</iajc>

<!-- Compile-time weaving -->

<iajc inpath="build/classes"
      destDir="build/classes"
      classpathRef="iajc.classpath"
      source="1.6"
      target="1.6"
      verbose="true"
      showWeaveInfo="false"
      failonerror="true"
      aspectPathRef="aspect.classpath"/>

The way that I fixed the problem was by removing build/classes from both iajc.classpath and aspect.classpath (see highlights).

The latter change was counter-intuitive because, after the "Compile custom aspects" step, I thought my custom aspect would live in build/classes and so need to be found there.

So my question is: what is the proper way to do what I'm trying to do? Must *.java/*.class and *.aj/*.class files be kept strictly separated?

And the possible bug is: why does <iajc> randomly fail to weave classes just because classpathRef and/or aspectPathRef has more stuff in it?

And even though the way I was doing it before may be improper usage, why is there non-determinism in the result? That seems bad in itself.

Thanks,
-Archie

--
Archie L. Cobbs



Back to the top