com.sun.tools.xjc.Plugin: 提供商 <plugin> 不是子类型
com.sun.tools.xjc.Plugin: Provider <plugin> not a subtype
我有一个使用 Maven 构建的 CXF JAX-RS 应用程序。我正在努力将其转换为 Gradle,但使用的是 Ant XJC 任务。
当前版本使用了几个扩展,其中一个是 "element wrapper" 插件的副本,另一个是 "jaxb-fluent-api".
我尝试将这两个插件的 jar 放入 xjc class 路径,但是当我 运行 XJC 任务时,我得到以下信息:
java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin:
Provider dk.conspicio.jaxb.plugins.XmlElementWrapperPlugin not a
subtype
XmlElementWrapperPlugin class 扩展了 "com.sun.tools.xjc.Plugin"。
知道这里发生了什么吗?
如果重要的话,我的 xjc 插件的 Maven 配置如下所示:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<extensions>
<extension>JAXBXMLElementWrapperPlugin:JAXBXMLElementWrapperPlugin:1.0.0</extension>
<extension>net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8</extension>
</extensions>
<xsdOptions>
<xsdOption>
<xsd>${basedir}/src/main/resources/schema/serviceCallResults.xsd</xsd>
<packagename>com.att.sunlight.service.domain.serviceCallResults</packagename>
<extension>true</extension>
<extensionArgs>
<extensionArg>-Xxew</extensionArg>
<extensionArg>-summary ${basedir}/target/xew-summary.txt</extensionArg>
<extensionArg>-instantiate lazy</extensionArg>
<extensionArg>-Xfluent-api</extensionArg>
</extensionArgs>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
这是我的 "build.gradle",仅省略了存储库:
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'war'
group = 'SunlightDataService'
version = '1.2.4-SNAPSHOT'
sourceCompatibility = 1.6
targetCompatibility = 1.6
repositories {
...
}
configurations {
jaxb
}
dependencies {
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.7-b41'
jaxb 'com.sun.xml.bind:jaxb-impl:2.2.7-b41'
jaxb 'javax.xml.bind:jaxb-api:2.2.7'
jaxb "JAXBXMLElementWrapperPlugin:JAXBXMLElementWrapperPlugin:1.0.0"
jaxb "net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8"
compile group: 'org.springframework', name: 'spring-beans', version:'3.2.8.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc-portlet', version:'3.2.8.RELEASE'
compile group: 'org.apache.cxf', name: 'cxf-rt-transports-http', version:'2.7.7'
compile group: 'log4j', name: 'log4j', version:'1.2.16'
compile group: 'org.springframework', name: 'spring-jdbc', version:'3.2.8.RELEASE'
compile group: 'org.springframework', name: 'spring-context', version:'3.2.8.RELEASE'
compile group: 'org.apache.cxf', name: 'cxf-rt-frontend-jaxrs', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-bindings-xml', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-databinding-jaxb', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-core', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-api', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-rs-extension-providers', version:'2.7.7'
compile group: 'org.codehaus.jettison', name: 'jettison', version:'1.3.4'
compile group: 'org.perf4j', name: 'perf4j', version:'0.9.14'
compile group: 'cglib', name: 'cglib', version:'2.2.2'
compile group: 'org.aspectj', name: 'aspectjweaver', version:'1.6.12'
compile group: 'commons-collections', name: 'commons-collections', version:'3.2.1'
compile group: 'esGateKeeper', name: 'GLCookieDecryption', version:'1.0.0'
compile group: 'joda-time', name: 'joda-time', version:'2.3'
compile group: 'org.apache.jackrabbit', name: 'jackrabbit-core', version:'2.4.0'
compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.1'
testCompile group: 'org.springframework', name: 'spring-test', version:'3.2.8.RELEASE'
testCompile group: 'oracle.jdbc', name: 'oracle.jdbc.OracleDriver', version:'1.0.0'
testCompile group: 'com.atomikos', name: 'transactions-jta', version:'3.7.0'
testCompile group: 'org.apache.cxf', name: 'cxf-rt-transports-http-jetty', version:'2.7.7'
testCompile group: 'com.atomikos', name: 'transactions-jdbc', version:'3.7.0'
testCompile group: 'org.mockito', name: 'mockito-all', version:'1.9.5'
testCompile group: 'junit', name: 'junit', version:'4.10'
testCompile group: 'org.assertj', name: 'assertj-core', version:'1.6.1'
providedCompile group: 'javax.transaction', name: 'jta', version:'1.1'
providedCompile group: 'javax.servlet.jsp', name: 'jsp-api', version:'2.1'
providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
}
task processXSDs() << {
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(line: "-Xxew")
arg(line: "-summary target/xew-summary.txt")
arg(line: "-instantiate lazy")
arg(line: "-Xfluent-api")
}
}
compileJava.dependsOn processXSDs
更新:
我确定这不是 "Element Wrapper" 扩展的问题。如果我从 class 路径中删除该 jar 并重建,它会为 "Fluent API" 插件报告相同的错误。
我还确定这不是严格意义上的 Gradle 问题。我在 Ant "build.xml" 和直接调用 "XJCFacade" Java class 的普通 shell 脚本中得到了相同的症状。事实上,我可以通过不指定任何架构文件来稍微简化此脚本,这清楚地表明即使在尝试处理任何架构之前也会发生此错误。
以下是我目前的脚本:
#! /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
您可以通过将所有这些工件下载到您的 Gradle 或 Maven 缓存并将它们复制到一个简单的文件夹结构中来构建相同的测试。
另请注意,我 运行 主要在 Windows 7 上进行此测试,但我压缩了此项目并将其移至我的 CentOS VM,它给了我完全相同的错误。
我试过了
java -cp jaxb-api-2.2.7.jar;jaxb-core-2.2.7.jar;jaxb-xjc-2.2.7.jar;commons-logging-1.1.1.jar;commons-lang-2.2.jar;jaxb2-basics-tools-0.6.5.jar;jaxb-xew-plugin-1.3.jar com.sun.tools.xjc.XJCFacade -verbose -extension -d src xsd
确实 Exception in thread "main" java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin: Provider com.sun.tools.xjc.addon.xew.XmlElementWrapperPlugin not a subtype
失败了,所以这个问题显然是可以重现的。我调试了 java.util.ServiceLoader
,结果发现插件应该作为参数传递给 XJC(而不是 Java 的 class 路径)。实际上,所有 Maven 插件(如 jaxb2-maven-plugin
或 maven-jaxb2-plugin
......)都知道此功能并正确形成 XJC 参数。所以正确的命令行是:
java -cp jaxb-api-2.2.7.jar;jaxb-core-2.2.7.jar;jaxb-xjc-2.2.7.jar;commons-lang-2.2.jar;commons-logging-1.1.1.jar com.sun.tools.xjc.XJCFacade -classpath jaxb-xew-plugin-1.3.jar;jaxb2-basics-tools-0.6.5.jar -verbose -extension -Xxew -d src xsd
请注意,-classpath
是 XJC 的参数。 commons-xxx
库可以进入系统 class 路径,因为它们导出的包未被屏蔽,但 jaxb2-basics-tools
应该在 XJC class 路径中。如果您对细节感兴趣:
发生这种情况是因为 XJC 进行了 class 路径加载程序筛选,以便能够在具有较低内置版本 API 的 JRE 中加载更高版本的 JAXB API。参见 XJCFacade.java line 69。这意味着 com.sun.tools.xjc.Plugin
由自定义 XJCFacade
classloader 加载一次,而相同的 class 由另一个(实际上是父级)classloader 再次加载 Class.forName("com.sun.tools.xjc.addon.xew.XmlElementWrapperPlugin")
被调用,但现在 class 不相等。
实际上你可以这样解决(源代码检查后找到的解决方案):
java -Dcom.sun.tools.xjc.XJCFacade.nohack=true -cp jaxb-core-2.2.7.jar;jaxb-xjc-2.2.7.jar;commons-lang-2.2.jar;commons-logging-1.1.1.jar;jaxb2-basics-tools-0.6.5.jar;jaxb-xew-plugin-1.3.jar com.sun.tools.xjc.XJCFacade -verbose -extension -Xxew -d src xsd
请注意,我已从 Java class 路径中删除了 jaxb-api-2.2.7.jar
,但您最好将 JAXB API 放入 lib/endorsed
,因为它可能不起作用在不同的 Java 版本上:适用于 Java 7,因为 it's JAXB API is close to 2.2.7,但可能不适用于 Java 6 + JAXB API 2.2.11.
不应 build/release 工程师或 jaxb-xjc 实现者应该被迫使用内部专有的 JAXB-JXC ClassLoader。最初的设计是 JDK 1.x 用户不会加载 JAXB-2.2。0.jar ..自 2010 年以来,JAXB 没有重大版本更改,jaxb-xjc 开发人员停止维护此插件适用于 JDK 5,6,7,8。我于 1 月 31 日向 CXF-Metro 的 Oracle 专家发送了一封电子邮件。如果我们没有收到他们的回音,请请求 Oracle 将代码发布到 OpenSource,这样至少它会得到维护。
这个插件的每个实现者都被这个短暂的解决方案绊倒了。无需使用遭受短期黑客攻击的未维护代码进一步惩罚未来的实施者。
此外,-DClassLoaderBuilder.noHack 选项完全绕过 Oracle 自己的安全管理器。这在银行和金融机构中是 VERBOTEN ...
当我收到 CXF Metro
的回复时,我会post 回来
感谢 dma_k,但从未提供有效的 gradle 解决方案。经过一些实验,这对我有用:
def xjcGeneratedSourcesDir = "$buildDir/generated-sources/xjc"
configurations {
jaxb
xjc
}
sourceSets {
main {
java.srcDir xjcGeneratedSourcesDir
}
}
dependencies {
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-core:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-impl:2.2.11'
jaxb 'javax.xml.bind:jaxb-api:2.2.11'
xjc "com.github.jaxb-xew-plugin:jaxb-xew-plugin:1.4"
xjc "net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8"
// etc.
}
task wsdl2java << {
file( xjcGeneratedSourcesDir ).mkdirs()
ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask',
classpath: configurations.jaxb.asPath)
ant.xjc(destdir: xjcGeneratedSourcesDir,
package: "com.localhost.jaxb", extension: true) {
schema(dir: "src/main/resources/schema", includes: "*.xsd")
classpath(path: configurations.xjc.asPath)
arg(line: "-Xxew")
arg(line: "-Xxew:summary $buildDir/xew-summary.txt")
arg(line: "-Xxew:instantiate lazy")
arg(line: "-Xfluent-api")
}
}
compileJava.dependsOn wsdl2java
我不会为 gradle 使用 ant 或 maven 任务,而是直接调用 Java class,例如 .
我有一个使用 Maven 构建的 CXF JAX-RS 应用程序。我正在努力将其转换为 Gradle,但使用的是 Ant XJC 任务。
当前版本使用了几个扩展,其中一个是 "element wrapper" 插件的副本,另一个是 "jaxb-fluent-api".
我尝试将这两个插件的 jar 放入 xjc class 路径,但是当我 运行 XJC 任务时,我得到以下信息:
java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin: Provider dk.conspicio.jaxb.plugins.XmlElementWrapperPlugin not a subtype
XmlElementWrapperPlugin class 扩展了 "com.sun.tools.xjc.Plugin"。
知道这里发生了什么吗?
如果重要的话,我的 xjc 插件的 Maven 配置如下所示:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<extensions>
<extension>JAXBXMLElementWrapperPlugin:JAXBXMLElementWrapperPlugin:1.0.0</extension>
<extension>net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8</extension>
</extensions>
<xsdOptions>
<xsdOption>
<xsd>${basedir}/src/main/resources/schema/serviceCallResults.xsd</xsd>
<packagename>com.att.sunlight.service.domain.serviceCallResults</packagename>
<extension>true</extension>
<extensionArgs>
<extensionArg>-Xxew</extensionArg>
<extensionArg>-summary ${basedir}/target/xew-summary.txt</extensionArg>
<extensionArg>-instantiate lazy</extensionArg>
<extensionArg>-Xfluent-api</extensionArg>
</extensionArgs>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
这是我的 "build.gradle",仅省略了存储库:
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'war'
group = 'SunlightDataService'
version = '1.2.4-SNAPSHOT'
sourceCompatibility = 1.6
targetCompatibility = 1.6
repositories {
...
}
configurations {
jaxb
}
dependencies {
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.7-b41'
jaxb 'com.sun.xml.bind:jaxb-impl:2.2.7-b41'
jaxb 'javax.xml.bind:jaxb-api:2.2.7'
jaxb "JAXBXMLElementWrapperPlugin:JAXBXMLElementWrapperPlugin:1.0.0"
jaxb "net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8"
compile group: 'org.springframework', name: 'spring-beans', version:'3.2.8.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc-portlet', version:'3.2.8.RELEASE'
compile group: 'org.apache.cxf', name: 'cxf-rt-transports-http', version:'2.7.7'
compile group: 'log4j', name: 'log4j', version:'1.2.16'
compile group: 'org.springframework', name: 'spring-jdbc', version:'3.2.8.RELEASE'
compile group: 'org.springframework', name: 'spring-context', version:'3.2.8.RELEASE'
compile group: 'org.apache.cxf', name: 'cxf-rt-frontend-jaxrs', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-bindings-xml', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-databinding-jaxb', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-core', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-api', version:'2.7.7'
compile group: 'org.apache.cxf', name: 'cxf-rt-rs-extension-providers', version:'2.7.7'
compile group: 'org.codehaus.jettison', name: 'jettison', version:'1.3.4'
compile group: 'org.perf4j', name: 'perf4j', version:'0.9.14'
compile group: 'cglib', name: 'cglib', version:'2.2.2'
compile group: 'org.aspectj', name: 'aspectjweaver', version:'1.6.12'
compile group: 'commons-collections', name: 'commons-collections', version:'3.2.1'
compile group: 'esGateKeeper', name: 'GLCookieDecryption', version:'1.0.0'
compile group: 'joda-time', name: 'joda-time', version:'2.3'
compile group: 'org.apache.jackrabbit', name: 'jackrabbit-core', version:'2.4.0'
compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.1'
testCompile group: 'org.springframework', name: 'spring-test', version:'3.2.8.RELEASE'
testCompile group: 'oracle.jdbc', name: 'oracle.jdbc.OracleDriver', version:'1.0.0'
testCompile group: 'com.atomikos', name: 'transactions-jta', version:'3.7.0'
testCompile group: 'org.apache.cxf', name: 'cxf-rt-transports-http-jetty', version:'2.7.7'
testCompile group: 'com.atomikos', name: 'transactions-jdbc', version:'3.7.0'
testCompile group: 'org.mockito', name: 'mockito-all', version:'1.9.5'
testCompile group: 'junit', name: 'junit', version:'4.10'
testCompile group: 'org.assertj', name: 'assertj-core', version:'1.6.1'
providedCompile group: 'javax.transaction', name: 'jta', version:'1.1'
providedCompile group: 'javax.servlet.jsp', name: 'jsp-api', version:'2.1'
providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5'
}
task processXSDs() << {
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(line: "-Xxew")
arg(line: "-summary target/xew-summary.txt")
arg(line: "-instantiate lazy")
arg(line: "-Xfluent-api")
}
}
compileJava.dependsOn processXSDs
更新:
我确定这不是 "Element Wrapper" 扩展的问题。如果我从 class 路径中删除该 jar 并重建,它会为 "Fluent API" 插件报告相同的错误。
我还确定这不是严格意义上的 Gradle 问题。我在 Ant "build.xml" 和直接调用 "XJCFacade" Java class 的普通 shell 脚本中得到了相同的症状。事实上,我可以通过不指定任何架构文件来稍微简化此脚本,这清楚地表明即使在尝试处理任何架构之前也会发生此错误。
以下是我目前的脚本:
#! /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
您可以通过将所有这些工件下载到您的 Gradle 或 Maven 缓存并将它们复制到一个简单的文件夹结构中来构建相同的测试。
另请注意,我 运行 主要在 Windows 7 上进行此测试,但我压缩了此项目并将其移至我的 CentOS VM,它给了我完全相同的错误。
我试过了
java -cp jaxb-api-2.2.7.jar;jaxb-core-2.2.7.jar;jaxb-xjc-2.2.7.jar;commons-logging-1.1.1.jar;commons-lang-2.2.jar;jaxb2-basics-tools-0.6.5.jar;jaxb-xew-plugin-1.3.jar com.sun.tools.xjc.XJCFacade -verbose -extension -d src xsd
确实 Exception in thread "main" java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin: Provider com.sun.tools.xjc.addon.xew.XmlElementWrapperPlugin not a subtype
失败了,所以这个问题显然是可以重现的。我调试了 java.util.ServiceLoader
,结果发现插件应该作为参数传递给 XJC(而不是 Java 的 class 路径)。实际上,所有 Maven 插件(如 jaxb2-maven-plugin
或 maven-jaxb2-plugin
......)都知道此功能并正确形成 XJC 参数。所以正确的命令行是:
java -cp jaxb-api-2.2.7.jar;jaxb-core-2.2.7.jar;jaxb-xjc-2.2.7.jar;commons-lang-2.2.jar;commons-logging-1.1.1.jar com.sun.tools.xjc.XJCFacade -classpath jaxb-xew-plugin-1.3.jar;jaxb2-basics-tools-0.6.5.jar -verbose -extension -Xxew -d src xsd
请注意,-classpath
是 XJC 的参数。 commons-xxx
库可以进入系统 class 路径,因为它们导出的包未被屏蔽,但 jaxb2-basics-tools
应该在 XJC class 路径中。如果您对细节感兴趣:
发生这种情况是因为 XJC 进行了 class 路径加载程序筛选,以便能够在具有较低内置版本 API 的 JRE 中加载更高版本的 JAXB API。参见 XJCFacade.java line 69。这意味着 com.sun.tools.xjc.Plugin
由自定义 XJCFacade
classloader 加载一次,而相同的 class 由另一个(实际上是父级)classloader 再次加载 Class.forName("com.sun.tools.xjc.addon.xew.XmlElementWrapperPlugin")
被调用,但现在 class 不相等。
实际上你可以这样解决(源代码检查后找到的解决方案):
java -Dcom.sun.tools.xjc.XJCFacade.nohack=true -cp jaxb-core-2.2.7.jar;jaxb-xjc-2.2.7.jar;commons-lang-2.2.jar;commons-logging-1.1.1.jar;jaxb2-basics-tools-0.6.5.jar;jaxb-xew-plugin-1.3.jar com.sun.tools.xjc.XJCFacade -verbose -extension -Xxew -d src xsd
请注意,我已从 Java class 路径中删除了 jaxb-api-2.2.7.jar
,但您最好将 JAXB API 放入 lib/endorsed
,因为它可能不起作用在不同的 Java 版本上:适用于 Java 7,因为 it's JAXB API is close to 2.2.7,但可能不适用于 Java 6 + JAXB API 2.2.11.
不应 build/release 工程师或 jaxb-xjc 实现者应该被迫使用内部专有的 JAXB-JXC ClassLoader。最初的设计是 JDK 1.x 用户不会加载 JAXB-2.2。0.jar ..自 2010 年以来,JAXB 没有重大版本更改,jaxb-xjc 开发人员停止维护此插件适用于 JDK 5,6,7,8。我于 1 月 31 日向 CXF-Metro 的 Oracle 专家发送了一封电子邮件。如果我们没有收到他们的回音,请请求 Oracle 将代码发布到 OpenSource,这样至少它会得到维护。 这个插件的每个实现者都被这个短暂的解决方案绊倒了。无需使用遭受短期黑客攻击的未维护代码进一步惩罚未来的实施者。 此外,-DClassLoaderBuilder.noHack 选项完全绕过 Oracle 自己的安全管理器。这在银行和金融机构中是 VERBOTEN ... 当我收到 CXF Metro
的回复时,我会post 回来感谢 dma_k,但从未提供有效的 gradle 解决方案。经过一些实验,这对我有用:
def xjcGeneratedSourcesDir = "$buildDir/generated-sources/xjc"
configurations {
jaxb
xjc
}
sourceSets {
main {
java.srcDir xjcGeneratedSourcesDir
}
}
dependencies {
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-core:2.2.11'
jaxb 'com.sun.xml.bind:jaxb-impl:2.2.11'
jaxb 'javax.xml.bind:jaxb-api:2.2.11'
xjc "com.github.jaxb-xew-plugin:jaxb-xew-plugin:1.4"
xjc "net.java.dev.jaxb2-commons:jaxb-fluent-api:2.1.8"
// etc.
}
task wsdl2java << {
file( xjcGeneratedSourcesDir ).mkdirs()
ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask',
classpath: configurations.jaxb.asPath)
ant.xjc(destdir: xjcGeneratedSourcesDir,
package: "com.localhost.jaxb", extension: true) {
schema(dir: "src/main/resources/schema", includes: "*.xsd")
classpath(path: configurations.xjc.asPath)
arg(line: "-Xxew")
arg(line: "-Xxew:summary $buildDir/xew-summary.txt")
arg(line: "-Xxew:instantiate lazy")
arg(line: "-Xfluent-api")
}
}
compileJava.dependsOn wsdl2java
我不会为 gradle 使用 ant 或 maven 任务,而是直接调用 Java class,例如