如何在命令行中使用jaxb2-annotate-plugin和XJC

问题描述:

我使用命令行(xjc.bat)中的“jaxb-ri”构建基于xsd的java类。 我想使用jaxb2-annotate_plugin在XmlType注释中设置命名空间,但我不知道如何将此插件添加到xjc classpath中并对其进行编程。如何在命令行中使用jaxb2-annotate-plugin和XJC

这里是我的外部bindings.xjb文件:

<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       xmlns:annox="http://annox.dev.java.net" 
       jxb:extensionBindingPrefixes="xjc annox" 
       version="2.1"> 
    <jxb:bindings schemaLocation="myschema.xsd" node="/xs:schema"> 
     <jxb:bindings node="xs:complexType[@name='MyType]"> 
      <annox:annotateClass>@javax.xml.bind.annotation.XmlType(namespace="urn:myschematwo")</annox:annotateClass> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

我的命令行是:

D:/jaxb-ri/bin/xjc.bat -p "com.jaxb.mypackage" -d 
"D:/myproject/src/main/java" D:/myschema.xsd -b "D:/bindings.xjb" 
-extension 

当我执行这个命令,我有一个错误消息说,“http://annox.dev.java.net”不支持的。

在此先感谢。

+0

确保正确的罐子位于classpath内,例如 'xjc.bat -classpath“jaxb2-basics-annotate-0.6.0.jar”' – Xstian

+0

感谢您的回应,我做到了,但我得到了以下错误==>线程“main”中的异常java.lang.NoClassDefFoundError :组织/ jvnet/jaxb2_commons /插件/ AbstractParameterizablePlugin 在java.lang.ClassLoader.defineClass1(本机方法) 在java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 在需要java.lang.ClassLoader.defineClass(类加载器.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) – Samy

+0

我认为还缺少'jaxb2-basics-tools-0.6.0.jar'。尝试将它添加到类路径中。 – Xstian

免责声明:我是jaxb2-annotate-plugin的作者。

首先,我没有提供命令行示例(据我所知),没有人使用命令行或批处理脚本进行模式编译。至少到目前为止没有任何要求。对于AntMavensamples,对Ant来说是一个接近命令行的用法。

接下来,我想知道xjc.bat是什么。

如果它从Java分发中调用xjc.exe,这很可能根本不适用于第三方插件,而不仅仅是jaxb2-annotate-plugin。原因是与Java分发的XJC版本有一个重命名的包:com.sun.tools.** - >com.sun.tools.internal.**。这打破了,与插件自然兼容。所以请确保xjc.bat不会调用Java发行版中包含的xjc.exe

我希望xjc.bat从JAXB RI Jars调用com.sun.tools.xjc.XJCFacade

要执行的插件,你需要两样东西:

  • 包括所有所需的依赖到classpath中。
  • 使用-Xannotate命令行参数打开插件。

这些依赖关系:

   <!-- JAXB2 Basics library --> 
       <include name="jaxb2-basics-*.jar"/> 
       <include name="jaxb2-basics-annotate*.jar"/> 
       <!-- JAXB2 Basics library dependencies --> 
       <include name="annox-*.jar"/> 
       <include name="javaparser-*.jar"/> 
       <include name="commons-beanutils-*.jar"/> 
       <include name="commons-logging-*.jar"/> 
       <include name="commons-lang3-*.jar"/> 

下面是完整的依赖关系树(含版本):

[INFO] org.jvnet.jaxb2_commons:jaxb2-basics-annotate:jar:1.0.3-SNAPSHOT 
[INFO] +- org.jvnet.jaxb2_commons:jaxb2-basics-tools:jar:0.8.1:compile 
[INFO] | +- commons-beanutils:commons-beanutils:jar:1.7.0:compile 
[INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] +- com.sun.xml.bind:jaxb-impl:jar:2.2.7:provided 
[INFO] | +- com.sun.xml.bind:jaxb-core:jar:2.2.7:provided 
[INFO] | | +- javax.xml.bind:jaxb-api:jar:2.2.11:provided 
[INFO] | | \- com.sun.istack:istack-commons-runtime:jar:2.16:provided 
[INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.12:provided 
[INFO] |  \- javax.xml.bind:jsr173_api:jar:1.0:provided 
[INFO] +- com.sun.xml.bind:jaxb-xjc:jar:2.2.7:provided 
[INFO] +- org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-testing:jar:0.9.0:test 
[INFO] | \- org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:jar:0.9.0:test 
[INFO] |  +- org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-core:jar:0.9.0:test 
[INFO] |  | +- com.sun.org.apache.xml.internal:resolver:jar:20050927:test 
[INFO] |  | +- org.apache.maven:maven-plugin-api:jar:2.0.9:test 
[INFO] |  | +- org.sonatype.plexus:plexus-build-api:jar:0.0.7:test 
[INFO] |  | \- org.apache.maven:maven-project:jar:2.0.9:test 
[INFO] |  |  +- org.apache.maven:maven-settings:jar:2.0.9:test 
[INFO] |  |  +- org.apache.maven:maven-profile:jar:2.0.9:test 
[INFO] |  |  +- org.apache.maven:maven-model:jar:2.0.9:test 
[INFO] |  |  +- org.apache.maven:maven-artifact-manager:jar:2.0.9:test 
[INFO] |  |  | +- org.apache.maven:maven-repository-metadata:jar:2.0.9:test 
[INFO] |  |  | \- org.apache.maven.wagon:wagon-provider-api:jar:1.0-beta-2:test 
[INFO] |  |  +- org.apache.maven:maven-plugin-registry:jar:2.0.9:test 
[INFO] |  |  \- org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:test 
[INFO] |  |  \- classworlds:classworlds:jar:1.1-alpha-2:test 
[INFO] |  +- org.codehaus.plexus:plexus-utils:jar:1.5.15:test 
[INFO] |  +- org.jvnet.jaxb2.maven2:maven-jaxb22-plugin:jar:0.9.0:test 
[INFO] |  \- org.apache.maven.plugin-tools:maven-plugin-annotations:jar:3.2:test 
[INFO] |  \- org.apache.maven:maven-artifact:jar:3.0:test 
[INFO] +- org.jvnet.annox:annox:jar:1.0.1:compile 
[INFO] | +- org.apache.commons:commons-lang3:jar:3.2.1:compile 
[INFO] | +- commons-io:commons-io:jar:1.2:compile 
[INFO] | \- com.google.code.javaparser:javaparser:jar:1.0.11:compile 
[INFO] \- junit:junit:jar:4.11:test 
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test 

Maven的东西是不相关的,否则你应该能够看到的版本。

希望这会有所帮助。

说实话,我有点不愿意在批处理/命令行示例中投入时间。但是如果你能找到工作的话,我会把它添加到样本中。

为什么你真的需要它在命令行?

+0

感谢您的重播。我以前从未使用Jaxb。一位同事给了我jaxb-ri包,这就是我用它的原因。有没有任何教程在eclipse中使用构建器?预先感谢。 – Samy

+0

@Samy在'pom.xml'中使用'maven-jaxb2-plugin'的Maven项目在Eclipse中基本上可以工作。 – lexicore

+0

试图让这个工作在Gradle,但它真的踢我的臀部。 :-( – user447607