ant xjc 任务与 jdk 6 一起工作

Posted

技术标签:

【中文标题】ant xjc 任务与 jdk 6 一起工作【英文标题】:ant xjc task to work with jdk 6 【发布时间】:2013-07-12 21:54:36 【问题描述】:

我正在使用 xjc ant 任务从 xsd 和 wsdl 生成 java 类,然后我从这些生成的类中生成一个 jar。 PFB 我正在使用的代码,

    <!-- Below code generates java classes from wsdl  -->
    <exec executable="xjc">
                <arg value="-wsdl" />
                <arg value="$wsdl/mysample.wsdl" />
                <arg value="-d" />
                <arg value="$myclasses" />
                 <arg value="-d" />
            <arg value="$myclasses" />
            <arg value="$xsdfile/mysample.xsd" />
     </exec> 

    <!-- Below code generates jar from java classes  -->
        <jar destfile="$jars/mysample.jar" basedir="$myclasses"/>

它在我的本地使用 JDK7 可以正常工作,但是当我将它部署到具有 jdk6 的服务器时,我得到了&lt;pre&gt;org.jboss.resteasy.spi.UnhandledException: java.lang.UnsupportedClassVersionError: com/my/webservices/mysampleweb。任何建议如何使这项工作?

编辑: 对于从 xsd 生成的某些类,我收到 major version 51 is newer than 50, the highest major version supported by this compiler. 错误。如何解决这个问题??

我检查了我的 ANT_HOME、java 版本和 jre 一切都很好。但是在通过命令行使用 ant 构建时我仍然收到上述错误。任何建议

【问题讨论】:

【参考方案1】:

如果您使用 Java 版本 7 构建并尝试在 Java 6 上运行它 - 或者实际上比您编译的 Java 版本更早的任何版本 - 您将收到此 UnsupportedClassVersionError。编译后的 Java 字节码与新版本的 JVM 前向兼容,但不向后兼容。将 Java 7 放在您的运行时环境中,或使用 JDK 6 进行编译。

Specifically, from Oracle's documentation of the Java 7 release:

二进制兼容性

Java SE 7 与 Java SE 6 二进制兼容,除了下面列出的不兼容性。除了提到的不兼容性之外,使用 Java SE 6 编译器构建的类文件将在 Java SE 7 中正确运行。

根据 JVM 规范,Java SE 7 的类文件版本是 51,因为 JSR 292 引入了调用动态字节码。Java SE 7 编译器生成的版本 51 类文件不能在 Java SE 6 中使用。

【讨论】:

我得到的主要版本 51 比 50 新,这是此编译器支持的最高主要版本。从 xsd 生成的某些类的错误。如何解决这个问题?? 您是否在已将应用程序部署到的服务器上收到该错误?如果是这样,那台机器需要运行 Java 7,或者您需要使用 Java 6 编译应用程序。 -source 选项告诉 javac 接受什么版本的源文件。 -target 告诉它生成与指定版本的 JVM 兼容的字节码,但这只有在您还指定 -bootclasspath-extdirs 选项以指向旧版本的 Java 引导类时才有效。我认为 OP 的问题可能可以通过该机制解决,但在开发和部署中使用相同的 JDK 是更好的做法(库兼容性等)。

以上是关于ant xjc 任务与 jdk 6 一起工作的主要内容,如果未能解决你的问题,请参考以下文章

如何修改Java 9的ANT build.xml中的xjc块?

如何使用 ANT 任务从 SVN 结帐?

JDK Tools - xjc: 将 XML Schema 编译成 Java 类

ivy (ant) 发布任务的 Nexus url

读取ant taskdef中的属性文件

Linux下安装Ant