123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732 |
- <refentry id="ajc-ref" xreflabel="The ajc Command-line Reference">
-
- <refnamediv>
- <refname>ajc</refname>
- <refpurpose>compiler and bytecode weaver for the AspectJ and Java languages</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>ajc</command>
- <arg><replaceable>Options</replaceable></arg>
- <group>
- <arg><replaceable>file...</replaceable></arg>
- <arg>@<replaceable>file...</replaceable></arg>
- <arg>-argfile <replaceable>file...</replaceable></arg>
- </group>
- </cmdsynopsis>
- </refsynopsisdiv>
- <refsect1 id="ajc" xreflabel="ajc">
- <title>Description</title>
-
- <para>The <command>ajc</command> command compiles AspectJ and Java
- language files, weaving aspects as necessary to produce .class files
- compliant with any Java VM (1.1 or later).
- To do bytecode weaving, it also accepts input classes or aspects
- in binary form.
- </para>
-
- <para> The arguments after the options specify the source file(s) to compile.
- (Specify source classes using the <parameter>-injars</parameter> or
- <parameter>-inpath</parameter> options, below.)
- Files may be listed directly on the command line, or listed in a file.
- The <parameter>-argfile <replaceable>file</replaceable></parameter>
- and <parameter>@<replaceable>file</replaceable></parameter> forms
- are equivalent, and are interpreted as meaning all the files listed in
- the specified file. Each line in these files should contain one option
- or filename. Comments, as in Java, start with <literal>//</literal> and
- extend to the end of the line.
- </para>
-
- <para>
- <command>NB:</command>
- You must explicitly pass <command>ajc</command> all sources necessary
- for the compilation. When compiling source files containing aspects
- or pointcuts, be sure
- to include the source files for any types affected by the aspects or
- picked out by the pointcuts.
- (To exclude types from the scope affected by the aspect,
- change the corresponding pointcut or declaration.)
- This is necessary because, unlike javac, ajc does not search the
- sourcepath for classes.
- You may use the <parameter>-sourceroots</parameter> option to specify
- as source all the .aj and .java files in a set of directory trees.
- </para>
-
- <refsect2>
- <title>Options</title>
-
- <variablelist>
-
- <varlistentry>
- <term>-injars <replaceable>JarList</replaceable></term>
- <listitem><para>
- deprecated: since 1.2, use -inpath, which also takes
- directories.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-inpath <replaceable>Path</replaceable></term>
- <listitem><para>
- Accept as source bytecode any .class files in the
- .jar files or directories on Path.
- The output will include these
- classes, possibly as woven with any applicable aspects.
- Path is a single argument containing
- a list of paths to zip files or directories,
- delimited by the platform-specific path delimiter.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-aspectpath <replaceable>JarList</replaceable></term>
- <listitem><para>
- Weave binary aspects from JarList zip files into all sources.
- The aspects should have been output by the same version
- of the compiler.
- To run the output classes requires putting all the
- aspectpath entries on the run classpath.
- JarList, like classpath, is a single argument containing
- a list of paths to jar files, delimited by the platform-
- specific classpath delimiter.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-argfile <replaceable>File</replaceable></term>
- <listitem><para>
- The file is a line-delimited list of arguments.
- These arguments are inserted into the argument list.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-outjar <replaceable>output.jar</replaceable></term>
- <listitem><para>Put output classes in zip file output.jar.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-incremental</term>
- <listitem><para>Run the compiler continuously.
- After the initial compilation, the compiler will
- wait to recompile until it reads a newline from the standard
- input, and will quit when it reads a 'q'.
- It will only recompile necessary components, so a recompile
- should be much faster than doing a second compile.
- This requires -sourceroots.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-sourceroots <replaceable>DirPaths</replaceable></term>
- <listitem><para>Find and build all .java or .aj source files under
- any directory listed in DirPaths.
- DirPaths, like classpath, is a single argument containing
- a list of paths to directories, delimited by the platform-
- specific classpath delimiter.
- Required by -incremental.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-emacssym</term>
- <listitem><para>
- Generate .ajesym symbol files for emacs support
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-Xlint</term>
- <listitem><para>Same as -Xlint:warning (enabled by default)
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-Xlint:{level}</term>
- <listitem><para>Set default level for messages about potential
- programming mistakes in crosscutting code.
- {level} may be ignore, warning, or error.
- This overrides entries in
- org/aspectj/weaver/XlintDefault.properties
- from aspectjtools.jar, but does not override levels set
- using the -Xlintfile option.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-Xlintfile <replaceable>PropertyFile</replaceable></term>
- <listitem><para>Specify properties file to set levels for
- specific crosscutting messages.
- PropertyFile is a path to a Java .properties file that
- takes the same property names and values as
- org/aspectj/weaver/XlintDefault.properties
- from aspectjtools.jar, which it also overrides.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-help</term>
- <listitem><para>
- Emit information on compiler options and usage
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-version</term>
- <listitem><para>
- Emit the version of the AspectJ compiler
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-classpath <replaceable>Path</replaceable></term>
- <listitem><para>
- Specify where to find user class files.
- Path is a single argument containing
- a list of paths to zip files or directories,
- delimited by the platform-specific path delimiter.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-bootclasspath <replaceable>Path</replaceable></term>
- <listitem><para>
- Override location of VM's bootclasspath
- for purposes of evaluating types when compiling.
- Path is a single argument containing
- a list of paths to zip files or directories,
- delimited by the platform-specific path delimiter.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-extdirs <replaceable>Path</replaceable></term>
- <listitem><para>
- Override location of VM's extension directories
- for purposes of evaluating types when compiling.
- Path is a single argument containing
- a list of paths to directories,
- delimited by the platform-specific path delimiter.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-d <replaceable>Directory</replaceable></term>
- <listitem><para>
- Specify where to place generated .class files.
- If not specified, <replaceable>Directory</replaceable>
- defaults to the current working dir.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-target <replaceable>[1.1 to 1.4]</replaceable></term>
- <listitem><para>Specify classfile target setting (1.1 to 1.4, default is 1.2)
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-1.3</term>
- <listitem><para>Set compliance level to 1.3
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-1.4</term>
- <listitem><para>Set compliance level to 1.4 (default)
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-source <replaceable>[1.3|1.4]</replaceable></term>
- <listitem><para>Toggle assertions (1.3 or 1.4, default is 1.3).
- When using -source 1.3, an assert() statement valid under
- Java 1.4 will result in a compiler error.
- When using -source 1.4,
- treat <literal>assert</literal> as a keyword and
- implement assertions according to the 1.4 language spec.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-nowarn</term>
- <listitem><para>Emit no warnings (equivalent to '-warn:none')
- This does not suppress messages
- generated by <literal>declare warning</literal> or
- <literal>Xlint</literal>.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-warn: <replaceable>items</replaceable></term>
- <listitem><para>Emit warnings for any instances of
- the comma-delimited list of questionable code
- (eg '-warn:unusedLocals,deprecation'):
- <programlisting><!-- unable to embed itemizedlist? -->
- constructorName method with constructor name
- packageDefaultMethod attempt to override package-default method
- deprecation usage of deprecated type or member
- maskedCatchBlocks hidden catch block
- unusedLocals local variable never read
- unusedArguments method argument never read
- unusedImports import statement not used by code in file
- none suppress all compiler warnings
- </programlisting>
- <literal>-warn:none</literal> does not suppress messages
- generated by <literal>declare warning</literal> or
- <literal>Xlint</literal>.
-
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-deprecation</term>
- <listitem><para>Same as -warn:deprecation
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-noImportError</term>
- <listitem><para>Emit no errors for unresolved imports
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-proceedOnError</term>
- <listitem><para>Keep compiling after error,
- dumping class files with problem methods
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-g<replaceable>:[lines,vars,source]</replaceable></term>
- <listitem>
- <para>debug attributes level, that may take three forms:
- <programlisting>
- -g all debug info ('-g:lines,vars,source')
- -g:none no debug info
- -g:{items} debug info for any/all of [lines, vars, source], e.g.,
- -g:lines,source
- </programlisting>
-
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-preserveAllLocals</term>
- <listitem><para>Preserve all local variables during code generation
- (to facilitate debugging).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-referenceInfo</term>
- <listitem><para>Compute reference information.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-encoding <replaceable>format</replaceable></term>
- <listitem><para>Specify default source encoding format.
- Specify custom encoding on a per file basis by suffixing
- each input source file/folder name with '[encoding]'.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-verbose</term>
- <listitem><para>Emit messages about accessed/processed compilation units
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-showWeaveInfo</term>
- <listitem><para>Emit messages about weaving
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-log <replaceable>file</replaceable></term>
- <listitem><para>Specify a log file for compiler messages.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-progress</term>
- <listitem><para>Show progress (requires -log mode).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-time</term>
- <listitem><para>Display speed information.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-noExit</term>
- <listitem><para>Do not call System.exit(n) at end of compilation
- (n=0 if no error)
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-repeat <replaceable>N</replaceable></term>
- <listitem><para>Repeat compilation process N times
- (typically to do performance analysis).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-Xnoweave</term>
- <listitem><para>(Experimental) produce unwoven class files
- for input using -injars.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-Xreweavable[:compress]</term>
- <listitem><para>(Experimental) runs weaver in reweavable mode which causes
- it to create woven classes that can be rewoven, subject to the restriction that
- on attempting a reweave all the types that advised the woven type must be accessible.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-XnoInline</term>
- <listitem><para>(Experimental) do not inline around advice
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-XincrementalFile <replaceable>file</replaceable></term>
- <listitem><para>(Experimental) This works like incremental mode,
- but using a file rather than standard input to control the compiler.
- It will recompile each time file is changed and
- and halt when file is deleted.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-XserializableAspects</term>
- <listitem><para>(Experimental) Normally it is an error to declare
- aspects Serializable. This option removes that restriction.
- </para></listitem>
- </varlistentry>
- </variablelist>
-
- </refsect2>
-
- <refsect2>
- <title>File names</title>
-
- <para>ajc accepts source files with either the <filename>.java</filename>
- extension or the <filename>.aj</filename> extension. We normally use
- <filename>.java</filename> for all of our files in an AspectJ system -- files
- that contain aspects as well as files that contain classes. However, if
- you have a need to mechanically distinguish files that use AspectJ's
- additional functionality from those that are pure Java we recommend using
- the <filename>.aj</filename> extension for those files.</para>
-
- <para>We'd like to discourage other means of mechanical distinction such as
- naming conventions or sub-packages in favor of the <filename>.aj</filename>
- extension.</para>
-
- <itemizedlist>
-
- <listitem><para>Filename conventions are hard to enforce and lead to awkward names
- for your aspects. Instead of <filename>TracingAspect.java</filename> we
- recommend using <filename>Tracing.aj</filename> (or just
- <filename>Tracing.java</filename>) instead.</para></listitem>
-
- <listitem><para>Sub-packages move aspects out of their natural place in a system
- and can create an artificial need for privileged aspects. Instead of
- adding a sub-package like <filename>aspects</filename> we recommend using the
- <filename>.aj</filename> extension and including these files in your existing
- packages instead.</para></listitem>
-
- </itemizedlist>
-
- </refsect2>
-
- <refsect2>
- <title>Compatibility</title>
-
- <para>
- AspectJ is a compatible extension to the Java programming language. The
- AspectJ compiler adheres to the <ulink
- url="http://java.sun.com/docs/books/jls/index.html"> <citetitle
- pubwork="book">The Java Language Specfication, Second
- Edition</citetitle></ulink> and to the <ulink
- url="http://java.sun.com/docs/books/vmspec/index.html"><citetitle
- pubwork="book">The Java Virtual Machine Specification, Second
- Edition</citetitle></ulink> and runs on any Java 2 compatible
- platform. The code it generates runs on any Java 1.1 or later
- compatible platform.</para>
-
- </refsect2>
-
- <refsect2>
- <title>Examples</title>
-
- <example id="simpleexample">
- <title>A simple example</title>
-
- <para>Compile two files:</para>
-
- <programlisting>
- ajc HelloWorld.java Trace.java
- </programlisting>
-
- </example>
-
- <example id="exampleusingargfile">
- <title>An example using -argfile/@</title>
-
- <para>
- To avoid specifying file names on the command line,
- list source files in a line-delimited text argfile.
- Source file paths may be absolute or relative to the argfile,
- and may include other argfiles by @-reference.
- The following file <literal>sources.lst</literal>
- contains absolute and relative files and @-references:
- </para>
- <programlisting>
- Gui.java
- /home/user/src/Library.java
- data/Repository.java
- data/Access.java
- @../../common/common.lst
- @/home/user/src/lib.lst
- view/body/ArrayView.java</programlisting>
-
- <para>Compile the files using either the -argfile or @ form:</para>
- <programlisting>
- ajc -argfile sources.lst
- ajc @sources.lst</programlisting>
- <para>
- Argfiles are also supported by jikes and javac, so you
- can use the files in hybrid builds. However, the support varies:
- </para>
- <itemizedlist>
- <listitem><para>Only ajc accepts command-line options</para></listitem>
- <listitem><para>Jikes and Javac do not accept internal @argfile references.
- </para></listitem>
- <listitem><para>Jikes and Javac only accept the @file form on the command line.</para></listitem>
- </itemizedlist>
-
- </example>
- <example id="examplebytecode">
- <title>An example using -injars and -aspectpath</title>
- <para>Bytecode weaving using -injars:
- AspectJ 1.1 supports weaving from input zip or jar files containing
- class files. Using input jars is like compiling the corresponding
- source files, and all binaries are emitted to output. Although
- Java-compliant compilers may differ in their output, ajc should
- take as input any class files produced by javac, jikes, eclipse,
- and, of course, ajc. Aspects included in -injars will be woven into
- like other .class files, but they will specify any crosscutting
- code (i.e., they will not be woven into other types). To use
- aspects in their binary form to specify crosscutting,
- see -aspectpath below.
- </para>
- <para>Aspect libraries using -aspectpath:
- AspectJ 1.1 supports weaving from read-only libraries containing
- aspects. Like input jars, they affect all input; unlike input
- jars, they themselves are not affected or emitted as output.
- Sources compiled with aspect libraries must be run with the same
- aspect libraries on their classpath.
- </para>
- <para>The following example builds the tracing example in a
- command-line environment; it creates a read-only aspect library,
- compiles some classes for use as input bytecode, and
- compiles the classes and other sources with the aspect library.
- </para>
- <para>The tracing example is in the AspectJ distribution
- ({aspectj}/doc/examples/tracing). This uses the following files:
- </para>
- <para><programlisting>
- aspectj1.1/
- bin/
- ajc
- lib/
- aspectjrt.jar
- examples/
- tracing/
- Circle.java
- ExampleMain.java
- lib/
- AbstractTrace.java
- TraceMyClasses.java
- notrace.lst
- Square.java
- tracelib.lst
- tracev3.lst
- TwoDShape.java
- version3/
- Trace.java
- TraceMyClasses.java
- </programlisting></para>
-
- <para>Below, the path separator is taken as ";", but file separators
- are "/". All commands are on one line. Adjust paths and
- commands to your environment as needed.
-
- </para><para>Setup the path, classpath, and current directory:</para>
-
- <programlisting>
- cd examples
- export ajrt=../lib/aspectjrt.jar
- export CLASSPATH="$ajrt"
- export PATH="../bin:$PATH"
- </programlisting>
-
- <para>Build a read-only tracing library:</para>
- <programlisting>
- ajc -argfile tracing/tracelib.lst -outjar tracelib.jar
- </programlisting>
-
- <para>Build the application with tracing in one step:</para>
-
- <programlisting>
- ajc -aspectpath tracelib.jar -argfile tracing/notrace.lst -outjar tracedapp.jar
- </programlisting>
-
- <para>Run the application with tracing:</para>
-
- <programlisting>
- java -classpath "$ajrt;tracedapp.jar;tracelib.jar" tracing.ExampleMain
- </programlisting>
-
- <para>Build the application with tracing from binaries in two steps:</para>
- <itemizedlist><listitem><para>
- (a) Build the application classes (using javac for demonstration's sake):</para>
- <programlisting>
- mkdir classes
- javac -d classes tracing/*.java
- jar cfM app.jar -C classes .
- </programlisting>
-
- </listitem>
- <listitem><para>
- (b) Build the application with tracing:</para>
- <programlisting>
- ajc -injars app.jar -aspectpath tracelib.jar -outjar tracedapp.jar
- </programlisting>
- </listitem></itemizedlist>
-
- <para>Run the application with tracing (same as above):</para>
-
- <programlisting>
- java -classpath "$ajrt;tracedapp.jar;tracelib.jar" tracing.ExampleMain
- </programlisting>
-
- <para>Run the application without tracing:</para>
-
- <programlisting>
- java -classpath "app.jar" tracing.ExampleMain
- </programlisting>
-
- </example>
-
- </refsect2>
-
- <refsect2>
- <title>The AspectJ compiler API</title>
-
- <para>The AspectJ compiler is implemented completely in Java and can be
- called as a Java class. The only interface that should be considered
- public are the public methods in <literal>org.aspectj.tools.ajc.Main</literal>.
- E.g., <literal>main(String[] args)</literal> takes the
- the standard <command>ajc</command> command line arguments.
- This means that an alternative way to run the
- compiler is </para>
-
- <cmdsynopsis>
- <command><literal>java org.aspectj.tools.ajc.Main</literal></command>
- <arg><replaceable>option...</replaceable></arg>
- <arg><replaceable>file...</replaceable></arg>
- </cmdsynopsis>
- <para>To access compiler messages programmatically, use the methods
- <literal>setHolder(IMessageHolder holder)</literal> and/or
- <literal>run(String[] args, IMessageHolder holder)</literal>.
- </para>
-
- </refsect2>
-
- <refsect2>
- <title>Stack Traces and the SourceFile attribute</title>
-
- <para>Unlike traditional java compilers, the AspectJ compiler may in
- certain cases generate classfiles from multiple source files.
- Unfortunately, the original Java class file format does not support
- multiple
- SourceFile attributes. In order to make sure all source file
- information is available, the AspectJ compiler may in some cases
- encode multiple filenames in the SourceFile attribute.
- When the Java VM generates stack traces, it uses this attribute
- to specify the source file.
- </para>
- <para>(The AspectJ 1.0 compiler also supports the .class file extensions of JSR-45.
- These permit compliant debuggers (such as jdb in Java 1.4.1) to identify
- the right file and line even given many source files for a single class.
- JSR-45 support is planned for ajc in AspectJ 1.1, but is not in the initial
- release. To get fully debuggable .class files, use the -XnoInline option.)
- </para>
-
- <para>Probably the only time you may see this format is when you view
- stack traces, where you may encounter traces of the format
- </para>
-
- <programlisting>
- java.lang.NullPointerException
- at Main.new$constructor_call37(Main.java;SynchAspect.java[1k]:1030)
- </programlisting>
-
- <para>where instead of the usual
- </para>
-
- <programlisting>
- File:LineNumber
- </programlisting>
-
- <para>format, you see
- </para>
-
- <programlisting>
- File0;File1[Number1];File2[Number2] ... :LineNumber
- </programlisting>
-
- <para>In this case, LineNumber is the usual offset in lines plus the
- "start line" of the actual source file. That means you use LineNumber
- both to identify the source file and to find the line at issue.
- The number in [brackets] after each file tells you the
- virtual "start line" for that file (the first file has a start of 0).
- </para>
-
- <para> In our example from the null pointer exception trace,
- the virtual start line is 1030. Since the file SynchAspect.java
- "starts" at line 1000 [1k], the LineNumber points to line 30 of
- SynchAspect.java.
- </para>
-
- <para> So, when faced with such stack traces, the way to find the actual
- source location is to look through the list of "start line" numbers to
- find the one just under the shown line number. That is the file where
- the source location can actually be found. Then, subtract that "start
- line" from the shown line number to find the actual line number within
- that file.
- </para>
-
- <para>In a class file that comes from only a single source file, the AspectJ
- compiler generates SourceFile attributes consistent with
- traditional Java compilers.
- </para>
-
- </refsect2>
-
-
- </refsect1>
- </refentry>
|