summaryrefslogtreecommitdiffstats
path: root/docs/devGuideDB/ltw.xml
blob: 29fc4e1a0a93547fd5b92b97e8e2cd19b24ad1c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
<chapter id="ltw" xreflabel="Load-Time Weaving">
    <title>Load-Time Weaving</title>
    
    <sect1 id="ltw-introduction">
        <title>Introduction</title>
        
        <para> The AspectJ 5 weaver takes class files as input and produces class files as output.
            The weaving process itself can take place at one of three different times: compile-time,
            post-compile time, and load-time. The class files produced by the weaving process (and
            hence the run-time behaviour of an application) are the same regardless of the approach
            chosen. </para>
            
        <itemizedlist>
            <listitem> <para>Compile-time weaving is the simplest approach. When you have the source code
                for an application, ajc will compile from source and produce woven class files as
                output. The invocation of the weaver is integral to the ajc compilation process. The
                aspects themselves may be in source or binary form. </para></listitem>
            <listitem> <para>Post-compile weaving (also sometimes called binary weaving) is used to weave
                existing class files and JAR files. As with compile-time weaving,
                the aspects used for weaving may be in source or binary form. </para></listitem>
            <listitem> <para>Load-time weaving (LTW) is simply binary weaving defered until the point that
                a class loader loads a class file and defines the class to the JVM. To support this,
                one or more "weaving class loaders", either provided explicitly by the run-time
                environment or enabled through a "weaving agent" are required. </para></listitem>
        </itemizedlist>
        
        <para> You may also hear the term "run-time weaving". We define this as the weaving of
            classes that have already been defined to the JVM (without reloading those
            classes). AspectJ 5 does not provide explicit support for run-time weaving although
            simple coding patterns can support dynamically enabling and disabling advice in aspects. </para>
        
        <sect2 id="weaving-class-files-more-than-once" xreflabel="weaving-class-files-more-than-once">
            <title>Weaving class files more than once</title>
        
            <para> By default a class file that has been woven by the AspectJ compiler cannot
                subsequently be rewoven (passed as input to the weaver). If you are developing
                AspectJ applications that are to be used in a load-time weaving environment, you
                need to specify the <literal>-Xreweavable</literal> compiler option when building
                them. This causes AspectJ to save additional state in the class files that is used
                to support subsequent reweaving. </para>
            <para><!-- FIXME AV -->As per AspectJ 1.5.0 M3 aspects (code style or annotation style) are
            reweavable by default, and weaved classes may be as well in 1.5.0 final.</para>
        </sect2>
    </sect1>
    
    <sect1 id="ltw-rules">
        <title>Load-time Weaving Requirements</title>
    
        <para> All load-time weaving is done in the context of a class loader, and hence the set of
            aspects used for weaving and the types that can be woven are affected by the class
            loader delegation model. This ensures that LTW complies with the Java 2 security model.
            The following rules govern the interaction of load-time weaving with class loading: </para>
    
        <orderedlist>
            <listitem> <para>All aspects to be used for weaving must be defined to the weaver before any
                types to be woven are loaded.</para></listitem>
            <listitem> <para>All abstract and concrete aspects visible to the weaver
                are available for extending (abstract aspects) and using for weaving. 
                A visible aspect is one defined by the
                weaving class loader or one of its parent class loaders.</para></listitem>
            <listitem><para>A class loader may only weave classes that it defines. It may not weave
                classes loaded by a delegate or parent class loader.</para></listitem>    
        </orderedlist>
        
    </sect1>
    
    <sect1 id="ltw-configuration">
        <title>Configuration</title>
        <para>AspectJ 5 supports a number of mechanisms designed to make load-time weaving as
        easy to use as possibe. The load-time weaving mechanism is chosen through JVM startup options. 
        Configuration files determine the set of aspects to be used for weaving and which 
        types will be woven. Additional diagnostic options allow the user to debug the configuration and 
        weaving process. </para>
        
        <sect2 id="enabling-load-time-weaving" xreflabel="enabling-load-time-weaving">
            <title>Enabling Load-time Weaving</title>
            <para> AspectJ 5 supports several different ways of enabling load-time weaving for
            an application: agents, a command-line launch script, and a set of interfaces for
            integration of AspectJ load-time weaving in custom environments. </para>
            <variablelist>
                <varlistentry>
                    <term>Agents</term>
                    <listitem>
                        <para>AspectJ 5 ships with a number of load-time weaving agents that
                            enable load-time weaving. These agents and their configuration
                            are execution environment dependent. Configuration for the supported environments is discussed
                            later in this chapter.</para>
                            <para>
                            Using Java 5 JVMTI you can specify the <literal>-javaagent:pathto/aspectjweaver.jar</literal> option
                            to the JVM.</para><para>
                            Using BEA JRockit and Java 1.3/1.4, the very same behavior can be obtained using BEA JRockit JMAPI features with
                            the <literal>-Xmanagement:class=org.aspectj.weaver.loadtime.JRockitAgent</literal>
                        </para>
                    </listitem>
                </varlistentry>
                <!-- FIXME: must be made consistent (aop.xml , CL hierarchy etc) -->
<!--                <varlistentry>-->
<!--                    <term>Command line</term>-->
<!--                    <listitem>-->
<!--                        <para> AspectJ includes a script "aj" that allows programs executed at-->
<!--                            the command line to take advantage of load-time weaving. -->
<!--                            The script is customized when AspectJ is installed depending on the chosen -->
<!--                            JDK. For example, for JDK 1.4 the script uses the-->
<!--                            <literal>-Djava.system.class.loader</literal> system property to replace-->
<!--                            the system class loader with a weaving class loader allowing classes -->
<!--                            loaded from the CLASSPATH to be woven. -->
<!--                            For JDK 1.5 the JVMTI weaving agent is used allowing classes loaded by all-->
<!--                            class loaders to be woven. Versions of the JDK prior to 1.3 are not-->
<!--                            supported by the "aj" mechanism. </para>-->
<!--                    </listitem>-->
<!--                </varlistentry>-->
                <varlistentry>
                    <term>Custom Integration</term>
                    <listitem>
                        <para> A public interface is provided to allow a user written class loader
                            to instantiate a weaver and weave classes after loading and before
                            defining them in the JVM. This enables load-time weaving to be supported in
                            environments where no weaving agent is available. It also allows the
                            user to explicity restrict by class loader which classes can be woven.</para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </sect2>
        
        <sect2 id="configuring-load-time-weaving-with-aopxml-files" xreflabel="configuring-load-time-weaving-with-aopxml-files">
            <title>Configuring Load-time Weaving with aop.xml files</title>
            
            <para>The weaver is configured using one or more <literal>META-INF/aop.xml</literal>
                files located on the class loader search path. Each file may define a list of
                concrete aspects to be used for weaving, type patterns describing which types
                should woven, and a set of options to be passed to the weaver. In addition AspectJ 5
                supports the definition of concrete aspects in XML. Aspects defined in this way
                must extend an abstract aspect visible to the weaver. The abstract aspect
                may define abstract pointcuts (but not abstract
                methods). The following example shows a simple aop.xml file: </para>
            <programlisting><![CDATA[
          <aspectj>

            <aspects>
              <!-- declare two existing aspects to the weaver -->
              <aspect name="com.MyAspect"/>
              <aspect name="com.MyAspect.Inner"/>

              <!-- define a concrete aspect inline -->
              <concrete-aspect name="com.xyz.tracing.MyTracing" extends="tracing.AbstractTracing">
                <pointcut name="tracingScope" expression="within(org.maw.*)"/>
              </concrete-aspect>

              <!-- Of the set of aspects known to the weaver, use aspects matching
                   the type pattern "com..*" for weaving. -->
              <include within="com..*"/>

              <!-- Do not use any aspects with the @CoolAspect annotation for weaving -->
              <exclude within="@CoolAspect *"/>

            </aspects>

            <weaver options="-verbose -XlazyTjp">
              <!-- Weave types that are within the javax.* or org.aspectj.*
                   packages. Also weave all types in the foo package that do
                   not have the @NoWeave annotation. -->
              <include within="javax.*"/>
              <include within="org.aspectj.*"/>
              <include within="(!@NoWeave foo.*) AND foo.*"/>
              <dump within="somepack.*"/><!-- will dump weaved classes to the "./_ajdump" folder on disk (for diagnostic purpose) -->
            </weaver>

          </aspectj>

		  ]]></programlisting>
          
            <para>
                An aop.xml file contains two key sections: "aspects" defines one
                or more aspects to the weaver and controls which aspects are to be
                used in the weaving process; "weaver" defines weaver options and which
                types should be woven.
            </para>
            
            <para>
                The simplest way to define an aspect to the weaver is to 
                specify the fully-qualified name of the aspect type in an aspect element. 
                You can also
                declare (and define to the weaver) aspects inline in the aop.xml file.
                This is done using the "concrete-aspect" element. A concrete-aspect
                declaration must provide a pointcut definition for every abstract 
                pointcut in the abstract aspect it extends. This mechanism is a 
                useful way of externalizing configuration for infrastructure and
                auxiliary aspects where the pointcut definitions themselves can be
                considered part of the configuration of the service.
            </para>

            <para>
                <emphasis>
                Note: concrete-aspect is not available in AspectJ 1.5 M3.
                </emphasis>
            </para>

            <para>
                The aspects element may optionally contain one or more include and
                exclude elements (by default, all defined aspects are used for weaving).
                Specifying include or exclude elements restricts the set of defined
                aspects to be used for weaving to those that are matched by an include
                pattern, but not by an exclude pattern. The 'within' attribute accepts
                a type pattern of the same form as a within pcd, except that &amp;&amp;
                and || are replaced by 'AND' and 'OR'.
            </para>
            
            <para>
                The weaver element is used to pass options to the weaver and to specify
                the set of types that should be woven. If no include elements are specified
                then all types seen by the weaver will be woven.
            </para>
          
          
            <para> When several configuration files are visible from a given weaving class loader
                their contents are conceptually merged (this applies to both aop.xml files
                and to aop.properties files as described in the next section). 
                The files are merged in the order they are
                found on the search path (regular <literal>getResourceAsStream</literal> lookup)
                according to the following rules: </para>
            <itemizedlist>
                <!-- FIXME AV - looks like we can refine conf in a child CL - not good -->
                <listitem> <para>The set of available aspects is the set of all
                    declared and defined aspects (<literal>aspect</literal> and
                    <literal>concrete-aspect</literal> elements of the <literal>aspects</literal>
                    section).</para></listitem>
                <listitem> <para>The set of aspects used for weaving is the subset of the available
                    aspects that are matched by at least one include statement and are not matched
                    by any exclude statements. If there are no include statements then all non-excluded
                    aspects are included.</para></listitem>
                <listitem> <para> The set of types to be woven are those types matched by at
                    least one weaver <literal>include</literal> element and not matched by any 
                    weaver <literal>exclude</literal> element. If there are no weaver include
                    statements then all non-excluded types are included.</para></listitem>
                <listitem> <para> The weaver options are derived by taking the union of the
                    options specified in each of the weaver options attribute specifications. Where an
                    option takes a value e.g. <literal>-warn:none</literal> the most recently defined value
                    will be used.</para></listitem>
            </itemizedlist>

            <para>It is not an error for the same aspect to be defined to the weaver in 
                more than one visible <literal>META-INF/aop.xml</literal> file. 
                However, if a declarative concrete aspect
                is declared in more than aop.xml file then an error will be issued.
                 A concrete aspect 
                defined in this way will be used to weave types loaded by the
                class loader that loaded the aop.xml file in which it was defined. 
                </para>
            
            <para> A <literal>META-INF/aop.xml</literal> file will automatically be generated when
                using the <literal>-outjar</literal> option of the AspectJ compiler. 
                It will simply contain a (possibly empty) set of aspect elements, one for
                each concrete aspect included in the JAR. </para>
        </sect2>

        <!-- TODO someone implement that -->
        <!--
        <sect2 id="configuring-load-time-weaving-with-properties-files" xreflabel="configuring-load-time-weaving-with-properties-files">
            <title>Configuring Load-time Weaving with Properties Files</title>
            <para> For memory constrained environments or those without support for XML a simple
                Java Properties file can be used to configure LTW. Just like XML files,
                <literal>META-INF/aop.properties</literal> files are loaded from the class loader
                search path. Everything that can be configured through XML can be configured using a
                Properties file, with the exception of declarative concrete aspects. For example: </para>
            <programlisting><![CDATA[
          aspects.names=com.MyAspect,com.MyAspect.Inner
          aspects.include=com..*
          aspects.exclude=@CoolAspect

          weaver.options=-verbose -XlazyTjp
          weaver.include=javax.* OR org.aspectj.*
		  ]]></programlisting>
        </sect2>
        -->

        <sect2 id="weaver-options" xreflabel="weaver-options">
            <title>Weaver Options</title>
            <para> The table below lists the AspectJ options supported by LTW. All other options
                will be ignored and a warning issued. </para>
            <informaltable>
                <tgroup cols="2">
                    <thead>
                        <row>
                            <entry>Option</entry>
                            <entry>Purpose</entry>
                        </row>
                    </thead>
                    <tbody>
                        <row>
                            <entry>
                                <literal>-verbose</literal>
                            </entry>
                            <entry>Issue informational messages about the weaving process. If ever you need to have information
                                   when the load time weaving engine is bootstrapped (hence its logger as per <literal>-XmessageHandlerClass:...</literal> not ready yet),
                                   you can use the option <literal>-Daj.weaving.verbose=true</literal> on the JVM startup command line. Messages will then be printed
                                   on stderr as long as the message handler class is not ready.
                            </entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-1.5</literal>
                            </entry>
                            <entry>Run the weaver in 1.5 mode (supports autoboxing in
                            join point matching)</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-XlazyTjp</literal>
                            </entry>
                            <entry>Performance optimization for aspects making use
                            of thisJoinPoint (non-static parts)</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-Xlintfile:pathToAResource</literal>
                            </entry>
                            <entry>Configure lint messages as specified in the given resource (visible from this aop.xml file' classloader)</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-Xlint:default, -Xlint:ignore, ...</literal>
                            </entry>
                            <entry>Configure lint messages, refer to documentation for meaningfull values</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-nowarn, -warn:none</literal>
                            </entry>
                            <entry>Suppress warning messages</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-proceedOnError</literal>
                            </entry>
                            <entry>Continue weaving even if errors occur (for example,
                             "... already woven" errors)</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-Xreweavable</literal>
                            </entry>
                            <entry>Produce class files that can subsequently be rewoven</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-XnoInline</literal>
                            </entry>
                            <entry>Don't inline around advice.</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-showWeaveInfo</literal>
                            </entry>
                            <entry>Issue informational messages whenever the weaver touches a class file</entry>
                        </row>
                        <row>
                            <entry>
                                <literal>-XmessageHandlerClass:...</literal>
                            </entry>
                            <entry>Provide alternative output destination to stdout/stderr for all weaver messages.
                            The given value must be the full qualified class name of a class that implements
                            <literal>org.aspectj.bridge.IMessageHandler</literal>
                            and that is visible from where the <literal>aop.xml</literal> is packed.
                            If more than one such options are used,
                            the first occurence only is taken into account.
                            You must also be very cautious about using a custom handler since it is likely that it will be invoked
                            (as well as all its third parties) while the weaving is done, which means that f.e. it cannot be weaved
                            by the aspects that are configured within the same deployment unit.
                            </entry>
                        </row>
                    </tbody>
                </tgroup>
            </informaltable>
        </sect2>
    </sect1>

    <sect1 id="ltw-specialcases">
        <title>Special cases</title>
        <para>
            Those classes are not exposed to the LTW infrastructure, no matter
            the configuration of the <literal>aop.xml</literal> file(s):
            <itemizedlist>
                <listitem> <para>All <literal>org.aspectj.*</literal> classes (and subpackages) - as those are needed by the infrastructure itself</para></listitem>
                <listitem> <para>All <literal>java.*</literal> and <literal>javax.*</literal> classes (and subpackages)</para></listitem>
                <listitem> <para>All <literal>sun.reflect.*</literal> classes - as those are JDK specific classes used when reflective calls occurs</para></listitem>
            </itemizedlist>
        </para>
        <para>
            Despite these restrictions, it is perfectly possible to match call join points for calls to these types providing the calling
            class is exposed to the weaver. Subtypes of these excluded types that are exposed to the weaver may of course be woven.
        </para>
        <para>
            Note that dynamic proxy representations are exposed to the LTW infrastructure and are not considered
            a special case.
        </para>
    </sect1>
    
    <sect1 id="ltw-packaging">
        <title>Runtime Requirements for Load-time Weaving</title>
        <para> To use LTW the <literal>aspectjweaver.jar</literal> library must be added to the
            classpath. This contains the AspectJ 5 runtime, weaver, weaving class loader and
            weaving agents. It also contains the DTD for parsing XML weaving configuration files. </para>
    </sect1>
    
    <sect1 id="ltw-agents">
        <title>Supported Agents</title>
        <sect2 id="jvmti" xreflabel="jvmti">
            <title>JVMTI</title>
            <para> When using Java 5 the JVMTI agent can be used by starting the JVM with the
                following option (adapt according to the path to aspectjweaver.jar): </para>
            <programlisting><![CDATA[
			-javaagent:pathto/aspectjweaver.jar
		  ]]></programlisting>
        </sect2>
        <sect2 id="jrockit" xreflabel="jrockit">
            <title>JRockit with Java 1.3/1.4 (use JVMTI on Java 5)</title>
            <para> The JRockit agent is configured with the following JVM option: </para>
            <programlisting><![CDATA[
			-Xmanagement:class=org.aspectj.weaver.loadtime.JRockitAgent
		  ]]></programlisting>
        </sect2>
    </sect1>
</chapter>