3

我以前发布过这个,但我认为最好重新表述这个问题,因为我没有从这个或我试图询问的任何其他地方得到有用的回应。

我试图在从 XJC 生成类时使用几个现有的 JAXB 扩展。使用“cxf-xjc-plugin”,此处理在 Maven 构建中运行良好很长时间。我正在尝试将此构建转换为 Gradle,但我发现除了 Maven 构建之外的所有其他策略都失败并出现相同的错误,如下所示:

引起:java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin: Provider com.sun.tools.xjc.addon.xew.XmlElementWrapperPlugin 不是 com.sun.tools.xjc.Options.findServices 的子类型(Options .java:957) 在 com.sun.tools.xjc.Options.getAllPlugins(Options.java:374) 在 com.sun.tools.xjc.Options.parseArgument(Options.java:688) 在 com.sun.tools。 xjc.Options.parseArguments(Options.java:809) 在 com.sun.tools.xjc.XJC2Task._doXJC(XJC2Task.java:474) 在 com.sun.tools.xjc.XJC2Task.doXJC(XJC2Task.java:457)在 com.sun.tools.xjc.XJC2Task.execute(XJC2Task.java:380) 在 com.sun.istack.tools.ProtectedTask.execute(ProtectedTask.java:103) 在 org.apache.tools.ant.UnknownElement.execute (UnknownElement.java:292) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)

我可以用一个简单的 Gradle 构建脚本来演示这一点。它不需要任何源代码或模式来编译,错误发生在设置类路径时。

请注意,尽管此处的错误引用了“Element Wrapper”插件,但如果我从类路径中删除该 jar,我会收到相同的错误,而是引用了另一个 JAXB 扩展,即“Fluent API”扩展。据我所知,我引用了这两个扩展的最新版本,以及 XJC 和相关 jar 的最新版本。

我当前的简单测试用例 Gradle 脚本是这样的(我称之为“testxjc.gradle”):

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'war'

sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
     maven { url "http://repo1.maven.org/maven2/" }
}

configurations {
    jaxb
}

dependencies {
    jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.7'
    jaxb "com.github.jaxb-xew-plugin:jaxb-xew-plugin:1.4"
    jaxb "net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8"
}

task processXSDs() << {
    URLClassLoader loader = GroovyObject.class.classLoader;
    configurations.jaxb.each { File file -> println file; loader.addURL(file.toURI().toURL()) }

    ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask',
                classpath: configurations.jaxb.asPath)

    ant.xjc(destdir: 'tmp', package: "com.att.sunlight.service.domain.serviceCallResults", extension: true) {
        schema(dir: "src/main/resources/schema", includes: "serviceCallResults.xsd")
        arg(value: "-Xxew")
        arg(value: "-summary target/xew-summary.txt")
        arg(value: "-instantiate lazy")
        arg(value: "-Xfluent-api")
    }
}

compileJava.dependsOn processXSDs

我用“gradle -b testxjc.gradle build --stacktrace”运行它

通过绕过 Ant 任务并直接使用 XJCFacade 类,我也能够演示相同的错误。这需要有所需的罐子可供参考。这是我当前的测试脚本(如果您在 Linux 上进行测试,请将分号更改为类路径中的冒号):

    #! /bin/bash
java -classpath "lib/commons-beanutils-1.7.0.jar;lib/commons-lang-2.2.jar;lib/commons-logging-1.1.1.jar;lib/istack-commons-runtime-2.16.jar;lib/jaxb2-basics-runtime-0.6.5.jar;lib/jaxb2-basics-tools-0.6.5.jar;lib/jaxb-api-2.2.7.jar;lib/jaxb-core-2.2.7.jar;lib/jaxb-fluent-api-2.1.8.jar;lib/jaxb-xew-plugin-1.4.jar;lib/jaxb-xjc-2.2.7.jar" com.sun.tools.xjc.XJCFacade -extension

我已经在 Win7 和 CentOS 上测试过了。

更新:

我现在有一两个线索。

首先,当我说我在 Win7 和 CentOS 上都进行了测试时,我指的是 shell 脚本。到目前为止,我还没有在 CentOS 上运行最小的 Gradle 构建脚本。当我在 CentOS 上运行这个最小的 Gradle 构建脚本时,它成功了(这意味着它抱怨缺少架构)。除了不同的操作系统,我在每个盒子上都有不同版本的 Gradle 和 Java。我正在交换这些版本,看看我还能找到什么其他线索。

我还收到了对“jaxb-dev”邮件列表的回复,有人说他们已经看到了这种症状,他们认为当在类路径上找到多个 JAXB jar 和一些 JAXB 时可能会发生这种情况类由一个类加载器加载,其他 JAXB 类由另一个加载。

从这个输入中,我想我应该尝试使用详细的类加载来运行我的最小测试,看看它们有什么不同,但我不确定我能否通过会产生的所有噪音看到我需要什么。

4

0 回答 0