blob: bc03c160691d9e93e2440dd85a76f6fa0bc3f7e3 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
This program and the accompanying materials are made available under the
terms of the Eclipse Distribution License v. 1.0, which is available at
http://www.eclipse.org/org/documents/edl-v10.php.
SPDX-License-Identifier: BSD-3-Clause
-->
<!DOCTYPE book [
<!ENTITY % ents SYSTEM "docbook.ent">
%ents;
]>
<section version="5.0" xml:id="tools-xjc-ant-task" xml:lang="en"
xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ns5="http://www.w3.org/1999/xhtml"
xmlns:ns3="http://www.w3.org/2000/svg"
xmlns:ns="http://docbook.org/ns/docbook"
xmlns:m="http://www.w3.org/1998/Math/MathML">
<title>XJC Ant Task</title>
<section>
<title><command>xjc</command> Task Overview</title>
<para>The <literal>jaxb-xjc.jar</literal> file contains the
<literal>XJCTask.class</literal> file, which allows the XJC binding
compiler to be invoked from the <link
xlink:href="http://ant.apache.org/">Ant</link> build tool. To
use <literal>XJCTask</literal>, include the following statement in
your <literal>build.xml</literal> file:</para>
<informalexample>
<programlisting language="xml"><![CDATA[<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
<classpath>
<fileset dir="path/to/jaxb/lib" includes="*.jar"/>
</classpath>
</taskdef>]]></programlisting>
</informalexample>
<para>This maps <literal>XJCTask</literal> to an Ant task named
<literal>xjc</literal>. For detailed examples of using this task,
refer to any of the <literal>build.xml</literal> files used by the <xref
linkend="jaxb-2-0-sample-apps" xrefstyle="select:title" />.</para>
</section>
<section xml:id="section-356252324237826">
<title><command>xjc</command> Task Attributes</title>
<section xml:id="section-304063270056995">
<title>Environment Variables</title>
<itemizedlist>
<listitem>
<para><link
xlink:href="http://wiki.apache.org/ant/TheElementsOfAntStyle">ANT_OPTS</link>
- command-line arguments that should be passed to the JVM.
For example, you can define system properties or set the
maximum Java heap size here.</para>
</listitem>
</itemizedlist>
</section>
<section xml:id="section-5746285947518106">
<title>Parameter Attributes</title>
<para><literal>xjc</literal> supports the following parameter
attributes.</para>
<informaltable frame="all">
<tgroup cols="3" colsep="1" rowsep="1">
<thead>
<row>
<entry><emphasis
role="bold">Attribute</emphasis></entry>
<entry><emphasis
role="bold">Description</emphasis></entry>
<entry><emphasis
role="bold">Required</emphasis></entry>
</row>
</thead>
<tbody>
<row>
<entry><para><literal>schema</literal></para></entry>
<entry><para>A schema file to be compiled. A file
name (can be relative to the build script base
directory), or an URL.</para></entry>
<entry><para>This or nested &lt;
<literal>schema</literal>&gt; elements are
required.</para></entry>
</row>
<row>
<entry><para><literal>binding</literal></para></entry>
<entry><para>An external binding file that will be
applied to the schema file.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>package</literal></para></entry>
<entry><para>If specified, generated code will be
placed under this Java package. This option is
equivalent to the "-p" command-line
switch.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>destdir</literal></para></entry>
<entry><para>Generated code will be written under
this directory. If you specify
<literal>destdir="abc/def"</literal> and
<literal>package="org.acme"</literal>, then files
are generated to
<literal>abc/def/org/acme</literal>.</para></entry>
<entry><para>Yes</para></entry>
</row>
<row>
<entry><para><literal>encoding</literal></para></entry>
<entry><para>Set the encoding name for generated
sources, such as EUC-JP or UTF-8. If it is not
specified, the platform default encoding is
used.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>readonly</literal></para></entry>
<entry><para>Generate Java source files in the
read-only mode if <literal>true</literal> is
specified. <literal>false</literal> by
default.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>header</literal></para></entry>
<entry><para>Generate a header in each generated
file indicating that this file is generated by such
and such version of &binding.impl.name; when.
<literal>true</literal> by default.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>extension</literal></para></entry>
<entry><para>If set to <literal>true</literal>, the XJC
binding compiler will run in the extension mode.
Otherwise, it will run in the strict conformance
mode. Equivalent of the "
<literal>-extension</literal>" command line switch.
The default is
<literal>false</literal>.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>catalog</literal></para></entry>
<entry><para>Specify the catalog file to resolve
external entity references. Support TR9401,
XCatalog, and OASIS XML Catalog format. See the
catalog-resolver sample for details.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>removeOldOutput</literal></para></entry>
<entry><para>Used in pair with nested
<literal>&lt;produces&gt;</literal> elements. When
this attribute is specified as " <literal>yes</literal>",
the files pointed to by the
<literal>&lt;produces&gt;</literal> elements will be
all deleted before the XJC binding compiler
recompiles the source files. See the up-to-date
check section for details.</para></entry>
<entry><para>No</para></entry>
</row>
<row>
<entry><para><literal>target</literal></para></entry>
<entry><para>Specifies the runtime environment in
which the generated code is supposed to run. Expects 2.0 or 2.1 values.
This allows more up-to-date versions of XJC to be used for
developing applications that run on earlier JAXB
versions.</para></entry>
<entry><para>No, defaults to "2.2"</para></entry>
</row>
<row>
<entry><para><literal>language</literal></para></entry>
<entry><para>Specifies the schema language to
compile. Supported values are "WSDL", "XMLSCHEMA",
and "WSDL." Case insensitive.</para></entry>
<entry><para>No, defaults to
"XMLSCHEMA"</para></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="section-123752426076382">
<title>Nested Elements</title>
<para><literal>xjc</literal> supports the following nested element
parameters.</para>
<section xml:id="section-7446361014928902">
<title><literal>schema</literal></title>
<para>To compile more than one schema at the same time, use a
nested <literal>&lt;schema&gt;</literal> element, which has
the same syntax as <link
xlink:href="http://ant.apache.org/manual/Types/fileset.html">
<literal>&lt;fileset&gt;</literal> </link>.</para>
</section>
<section xml:id="section-354179298981749">
<title><literal>binding</literal></title>
<para>To specify more than one external binding file at the
same time, use a nested <literal>&lt;binding&gt;</literal>
element, which has the same syntax as <link
xlink:href="http://ant.apache.org/manual/Types/fileset.html">
<literal>&lt;fileset&gt;</literal> </link>.</para>
</section>
<section xml:id="section-583580759538928">
<title><literal>classpath</literal></title>
<para>To specify locations of the user-defined classes
necessary during the compilation (such as an user-defined type
that is used through a <literal>&lt;javaType&gt;</literal>
customization), use nested
<literal>&lt;classpath&gt;</literal> elements. For the syntax,
see <link
xlink:href="http://ant.apache.org//manual/using.html#path">"path-like
structure"</link> .</para>
</section>
<section xml:id="section-5197406266536">
<title><literal>arg</literal></title>
<para>Additional command line arguments passed to the XJC. For
details about the syntax, see <link
xlink:href="http://ant.apache.org/manual/using.html#arg">the
relevant section</link> in the Ant manual. This nested element
can be used to specify various options not natively supported
in the <command>xjc</command> Ant task. For example, currently there
is no native support for the following <command>xjc</command>
command-line options:</para>
<itemizedlist>
<listitem>
<para><option>-nv</option></para>
</listitem>
<listitem>
<para><option>-use-runtime</option></para>
</listitem>
<listitem>
<para><option>-schema</option></para>
</listitem>
<listitem>
<para><option>-dtd</option></para>
</listitem>
<listitem>
<para><option>-relaxng</option></para>
</listitem>
<listitem>
<para><option>-Xlocator</option></para>
</listitem>
<listitem>
<para><option>-Xsync-methods</option></para>
</listitem>
</itemizedlist>
<para>To use any of these features from the
<literal>&lt;xjc&gt;</literal> Ant task, you must specify the
appropriate nested &lt; <literal>arg</literal>&gt; elements.</para>
</section>
<section xml:id="section-348709288221071">
<title><literal>depends</literal></title>
<para>Files specified with this nested element will be taken
into account when the XJC task does the up-to-date check. See
the up-to-date check section for details. For the syntax, see
<link
xlink:href="http://ant.apache.org/manual/Types/fileset.html">
<literal>&lt;fileset&gt;</literal> </link>.</para>
</section>
<section xml:id="section-061536175632223">
<title><literal>produces</literal></title>
<para>Files specified with this nested element will be taken
into account when the XJC task does the up-to-date check. See
the up-to-date check section for details. For the syntax, see
<link
xlink:href="http://ant.apache.org/manual/Types/fileset.html">
<literal>&lt;fileset&gt;</literal> </link>.</para>
</section>
<section xml:id="section-6395468661397454">
<title><literal>xmlcatalog</literal></title>
<para>The <link
xlink:href="http://ant.apache.org/manual/Types/xmlcatalog.html">xmlcatalog</link>
element is used to resolve entities when parsing schema
documents.</para>
</section>
</section>
</section>
<section xml:id="section-837075444051632">
<title>Generated Resource Files</title>
<para>Please see the <xref linkend="xjcresources"
xrefstyle="select:title" /> for more detail.</para>
</section>
<section xml:id="section-767416326934949">
<title>Up-to-date Check</title>
<para>By default, the XJC binding compiler always compiles the inputs.
However, with a little additional setting, it can compare timestamps
of the input files and output files and skip compilation if the files
are up-to-date.</para>
<para>Ideally, the program should be able to find out all the inputs
and outputs and compare their timestamps, but this is difficult and
time-consuming. So you have to tell the task input files and output
files manually by using nested <literal>&lt;depends&gt;</literal> and
<literal>&lt;produces&gt;</literal> elements. Basically, the XJC
binding compiler compares the timestamps specified by the
<literal>&lt;depends&gt;</literal> elements against those of the
<literal>&lt;produces&gt;</literal> set. If any one of the "depends"
file has a more recent timestamp than some of the files in the
"produces" set, it will compile the inputs. Otherwise it will skip the
compilation.</para>
<para>This will allow you to say, for example "if any of the
<literal>.xsd</literal> files in this directory are newer than the
<literal>.java</literal> files in that directory, recompile the
schema".</para>
<para>Files specified as the schema files and binding files are
automatically added to the "depends" set as well, but if those schemas
are including/importing other schemas, you have to use a nested
<literal>&lt;depends&gt;</literal> elements. No files are added to the
<literal>&lt;produces&gt;</literal> set, so you have to add all of
them manually.</para>
<para>A change in a schema or an external binding file often results
in a Java file that stops being generated. To avoid such an "orphan"
file, it is often desirable to isolate all the generated code into a
particular package and delete it before compiling a schema. This can
be done by using the <literal>removeOldOutput</literal> attribute.
This option allows you to remove all the files that match the
"produces" filesets before a compilation. <emphasis>Be careful when
you use this option so that you don't delete important
files</emphasis>.</para>
</section>
<section xml:id="section-31739621133682">
<title>Schema Language Support</title>
<para>This release of the &binding.impl.name; includes experimental support for
RELAX NG, DTD, and WSDL. To compile anything other than W3C XML Schema
from the <command>xjc</command> Ant task, you must use the nested &lt;
<literal>arg</literal>&gt; element to specify the appropriate command line
switch, such as <option>-dtd</option>, <option>-relaxng</option>, or <option>-wsdl</option>. Otherwise, your input schemas will be treated as
W3C XML Schema and the binding compiler will fail.</para>
</section>
<section xml:id="section-607840891098334">
<title><command>xjc</command> Examples</title>
<para>Compile <literal>myschema.xsd</literal> and place the generated
files under <package>src/org/acme/foo</package>:</para>
<informalexample>
<programlisting language="xml"><![CDATA[<xjc schema="src/myschema.xsd" destdir="src" package="org.acme.foo"/>]]></programlisting>
</informalexample>
<para>Compile all XML Schema files in the <literal>src</literal>
directory and place the generated files under the appropriate packages
in the <literal>src</literal> directory:</para>
<informalexample>
<programlisting language="xml"><![CDATA[<xjc destdir="src">
<schema dir="src" includes="*.xsd"/>
</xjc>]]></programlisting>
</informalexample>
<para>Compile all XML Schema files in the <literal>src</literal>
directory together with binding files in the same directory and places
the generated files under the appropriate packages in the
<literal>src</literal> directory. This example assumes that binding
files contain package customizations. This example doesn't search
subdirectories of the <literal>src</literal> directory to look for
schema files.</para>
<informalexample>
<programlisting language="xml"><![CDATA[<xjc destdir="src">
<schema dir="src" includes="*.xsd"/>
<binding dir="src" includes="*.xjb"/>
</xjc>]]></programlisting>
</informalexample>
<para>Compile <literal>abc.xsd</literal> with an up-to-date check.
Compilation only happens when <literal>abc.xsd</literal> is newer than
any of the files in the <literal>src/org/acme/foo</literal> directory
(and its <literal>impl</literal> subdirectory). Files in these two
directories will be wiped away before a compilation, so
<emphasis>don't add your own code in those directories</emphasis>.
Note that the additional <literal>mkdir</literal> task is necessary
because Ant's fileset requires the directory specified by the
<literal>dir</literal> attribute to exist.</para>
<informalexample>
<programlisting language="xml"><![CDATA[<mkdir dir="src/org/acme/foo"/>
<xjc destdir="src" schema="abc.xsd" removeOldOutput="yes"
package="org.acme.foo">
<produces dir="src/org/acme/foo" includes="* impl/*"/>
</xjc>]]></programlisting>
</informalexample>
<para>More complicated example of up-to-date check. In this example,
we assume that you have a large set of schema documents that reference
each other, with DTDs that describe the schema documents. An explicit
&lt;depends&gt; is necessary so that when you update one of the DTDs,
XJC will recompile your schema. But &lt;depends&gt; don't have to
re-specify all the schema files, because you've already done that via
&lt;schema&gt;.</para>
<informalexample>
<programlisting language="xml"><![CDATA[<mkdir dir="src/org/acme/foo"/>
<xjc destdir="src" removeOldOutput="yes"
package="org.acme.foo">
<schema dir="schema" includes="*.xsd"/>
<depends dir="schema" includes="*.dtd"/>
<produces dir="build/generated-src/org/acme/foo"
includes="**/*"/>
</xjc>]]></programlisting>
</informalexample>
<para>Compile all XML Schema files in the <literal>src</literal>
directory and subdirectories, excluding files named
<literal>debug.xsd</literal>, and place the generated files under the
appropriate packages in the <literal>src</literal> directory. This
example also specifies the <option>-nv</option> option, which disables
the strict schema correctness checking:</para>
<informalexample>
<programlisting language="xml"><![CDATA[<xjc destdir="src">
<schema dir="src" includes="**/*.xsd"
excludes="**/debug.xsd"/>
<arg value="-nv"/>
</xjc>]]></programlisting>
</informalexample>
<para>If you depend on a proxy server to resolve the location of
imported or included schemas (as you might if you're behind a
firewall), you need to make the hostname and port number accessible to
the JVM hosting <literal>ant</literal>. Do this by setting the
environment variable <literal>ANT_OPTS</literal> to a string
containing the appropriate <literal>java</literal> options. For
example, from DOS:</para>
<informalexample>
<programlisting><![CDATA[> set ANT_OPTS=-Dhttp.proxyHost=webcache.east
> set ANT_OPTS=%ANT_OPTS% -Dhttp.proxyPort=8080
> ant]]></programlisting>
</informalexample>
</section>
</section>