users@jaxb.java.net

Re: xjc shows platform dependant behaviour (external/custom bindings problem)

From: Ed Mooney <Ed.Mooney_at_sun.com>
Date: Mon, 17 Mar 2003 09:46:47 -0500

Hi Stefan,

What happens when you invoke xjc directly? E.g.:

     java -jar $JWSDP_HOME/jaxb-1.0/lib/jaxb-xjc.jar \
     -d ${jaxb-generated-src} \
     -p ${jaxb-package} \
     -b ${xschema}/jaxb-external-bindings.xjb \
     ${xschema}/*.xsd

Regards,
--
Ed Mooney         |Sun Microsystems, Inc.|Time flies like
Java Web Services |UBUR02-201            |an arrow, but
Ed.Mooney_at_Sun.COM |1 Network Drive       |fruit flies like
781-442-0459      |Burlington, MA  01803 |a banana. Groucho
Stefan Kreutter wrote:
> I have a couple of XSchema files in my project and all of them include
> (at least indirectly) one schema: BasicTypes.xsd
> In BasicTypes.xsd I used to have a customized binding:
>
>     <xsd:annotation>
>         <xsd:appinfo>
>             <jxb:schemaBindings>
>                 <jxb:nameXmlTransform>
>                     <jxb:typeName prefix="JAXBGen"/>
>                     <jxb:elementName prefix="JAXBGen"/>
>                     <jxb:modelGroupName prefix="JAXBGen"/>
>                 </jxb:nameXmlTransform>
>             </jxb:schemaBindings>
>         </xsd:appinfo>
>     </xsd:annotation>
>
> so all classes generated by xjc will have a prefix of 'JAXBGen' - which
> works fine on Win2K and Mac OS X. But on Linux the prefix is missing on
> the generated java sources. It turned out, that on Win2K and Mac OS X
> xjc first processes BasicTypes.xsd but on Linux LocatorTypes.xsd (which
> includes BasicTypes.xsd) is processed first:
>
>        win2k> xjc
>        win2k> Compiling file:/ ... /BasicTypes.xsd
> vs.
>        linux> xjc
>        linux> Compiling file:/ ... /LocatorTypes.xsd
>
> In my ant-script xjc ist called this way:
>
>         <xjc target="${jaxb-generated-src}" package="${jaxb-package}">
>             <schema dir="${xschema}" includes="*.xsd"/>
>         </xjc>
>
> where ${xschema} is the directory that contains all schema files. So it
> seems that the order xjc processes its input files is platform or
> file-system dependant and if the custom-binding is not in the first
> xschema processed the binding will not be taken into account.
>
> Since external bindings now work with JAXB 1.0 final I modified the
> ant-script to call xjc like this:
>
>         <xjc target="${jaxb-generated-src}" package="${jaxb-package}">
>             <binding file="${xschema}/jaxb-external-bindings.xjb"/>
>             <schema dir="${xschema}" includes="*.xsd"/>
>         </xjc>
>
> jaxb-external-bindings.xjb looks like this:
>
> <jxb:bindings version="1.0"
>     xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
>     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
>     <jxb:bindings schemaLocation="BasicTypes.xsd" node="/xsd:schema">
>         <jxb:schemaBindings>
>             <jxb:nameXmlTransform>
>                 <jxb:typeName prefix="JAXBGen"/>
>                 <jxb:elementName prefix="JAXBGen"/>
>                 <jxb:modelGroupName prefix="JAXBGen"/>
>             </jxb:nameXmlTransform>
>         </jxb:schemaBindings>
>     </jxb:bindings>
> </jxb:bindings>
>
> but since I have to specify a schemaLocation (BasicTypes.xsd) the same
> problem occurs again. My current workaround is that I duplicated the
> binding for BasicTypes.xsd with a reference to LocatorTypes.xsd. Now
> xjc works fine on all three platforms.
>
> Is it possible to specify bindings for all xsd-files that xjc will
> process?
> Maybe this is a bug in xjc or somewhere in the libs dealing with xml
> and xsd?
>
> Any ideas for a better workaround?
>
> Best regards,
>  Stefan
>
> PS: I strongly recommend  to use ant 1.5.2 with JAXB's xjc task it
> seems to fix a nasty problem with xjc reporting strange errors.