cxf-codegen-plugin 端口到 Gradle
cxf-codegen-plugin port to Gradle
我正在尝试复制此插件在 Gradle 中的作用。如果我执行:
./wsdl2java -encoding UTF-8 -d /src/target/generated-sources/cxf -fe jaxws21
-sn UserSoapServicePorts -faultSerialVersionUID 1 -xjc-Xannotate
-p http:... -p urn:... -p urn:... -p urn:... -p urn:h... -p urn:...
-p urn:... -p urn:...
-verbose /src/xmlTemp/user-soap-v1.wsdl
...然后我得到:
an 22, 2016 3:51:05 PM org.apache.cxf.wsdl11.WSDLServiceBuilder checkForWrapped
INFO: Operation {urn:stuff:wsdl:person:v1}doSomething cannot be unwrapped, input message must reference global element declaration with same localname as operation
据我所知,虽然线条是相同的。有什么想法可能是错误的吗?
使用
buildscript {
ext {
xjcVersion= '3.0.5'
jaxbOutputDir = "$buildDir/generated/cxf"
jaxb2BasicsVersion = '0.11.0'
}
}
configurations {
cxf
}
apply plugin: 'java'
apply plugin: 'eclipse'
sourceSets {
main {
java {
srcDirs += "$jaxbOutputDir"
}
}
}
task wsdl2java(type: JavaExec) {
ext {
outputDir = file("$jaxbOutputDir")
}
systemProperties = ['javax.xml.accessExternalSchema': 'file' , 'file.encoding':'UTF8']
outputs.upToDateWhen { false }
outputs.dir outputDir
main = 'org.apache.cxf.tools.wsdlto.WSDLToJava'
classpath = project.configurations.cxf
args '-d', outputDir
args '-fe', 'jaxws21'
args '-client'
args '-verbose'
args '-validate'
args '-mark-generated'
// args '-xjc-X'
args '-xjc-Xfluent-api'
args '-xjc-Xts'
args '-xjc-XhashCode'
args '-xjc-Xequals'
args '-b',"$projectDir/src/main/resources/jaxws-custom-bindings.xjb"
args "$projectDir/src/main/resources/wsdl/myWsdl.wsdl"
doLast {
println "----- cxf jaxb2 files generated -----"
}
}
dependencies {
cxf "org.apache.cxf:cxf-tools-wsdlto-core:$cxfVersion"
cxf "org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:$cxfVersion"
cxf "org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:$cxfVersion"
cxf "org.jvnet.jaxb2_commons:jaxb2-fluent-api:3.0"
cxf "org.apache.cxf.xjcplugins:cxf-xjc-ts:$xjcVersion"
cxf "org.jvnet.jaxb2_commons:jaxb2-basics:$jaxb2BasicsVersion"
compile "org.apache.cxf.xjc-utils:cxf-xjc-runtime:$xjcVersion"
compile "org.jvnet.jaxb2_commons:jaxb2-basics-runtime:$jaxb2BasicsVersion"
compile 'commons-lang:commons-lang:2.6'
}
compileJava.dependsOn wsdl2java
玩得开心。
这个答案类似于 Stefan K 的方法,但适用于 Java 10 和 Gradle 4.6,并且与 Maven 插件 cxf-codegen-plugin.[=18= 大致相同]
此解决方案基于 2013 年 mooregreatsoftware.com 的博客 post Generated Files in Gradle。不同之处在于
- 通过在 Groovy
中实现非常简单的 TeeOutputStream
内联,避免了构建脚本对 commons-io:commons-io
的依赖
- 它被修改为与 Java 9、10 和潜在的 11 一起工作。
主要动机之一是 JEP 320: Remove the Java EE and CORBA Modules,计划在 Java 11。有一些方法可以让 Java 9 和 Java 10 使用--add-modules java.se.ee
之类的东西,但 JEP 320 声明:
Since standalone versions of the Java EE technologies are readily available from third-party sites, such as Maven Central, there is no need for the Java SE Platform or the JDK to include them.
这里有两个代码清单,第一个是完成工作的更紧凑的代码。第二个代码清单是相同的代码,但带有注释并注释掉了您可能想要覆盖的传递依赖项。
较短的版本
plugins {
id 'java'
id 'project-report'
}
repositories {
jcenter()
}
sourceCompatibility = 10
targetCompatibility = 10
configurations {
wsdl2java
}
dependencies {
compile 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.2'
compile 'org.apache.cxf:cxf-rt-transports-http:3.2.2'
compile 'javax.xml.ws:jaxws-api:2.3.0'
compile 'javax.jws:jsr181-api:1.0-MR1'
compile 'javax.xml.bind:jaxb-api:2.3.0'
compile 'javax.activation:javax.activation-api:1.2.0'
compile 'javax.annotation:javax.annotation-api:1.3'
wsdl2java 'javax.xml.bind:jaxb-api:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-ri:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-xjc:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-core:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-impl:2.3.0'
wsdl2java 'javax.activation:javax.activation-api:1.2.0'
wsdl2java 'javax.annotation:javax.annotation-api:1.3'
wsdl2java 'javax.xml.ws:jaxws-api:2.3.0'
wsdl2java 'javax.jws:jsr181-api:1.0-MR1'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:3.2.2'
}
def wsdl2java = task generateJavaFromWsdl(type: JavaExec) {
String wsdl = 'src/main/resources/some.wsdl'
String genSrcDir = "${projectDir}/build/generated-sources/cxf-ws"
inputs.file wsdl
outputs.dir genSrcDir
classpath configurations.wsdl2java
main "org.apache.cxf.tools.wsdlto.WSDLToJava"
args '-encoding', 'UTF-8', '-d', genSrcDir, wsdl
OutputStream baos = new ByteArrayOutputStream()
errorOutput = new OutputStream() {
void write(int b) {System.err.write(b); baos.write(b) }
void flush() { System.err.flush(); baos.flush() }
void close() { System.err.close(); baos.close() }
}
doLast {
def str = baos.toString()
if (str.contains('Usage : wsdl2java') || str.contains('WSDLToJava Error')) {
throw new TaskExecutionException(tasks[name],
new IOException('Apache CXF WSDLToJava has failed. Please see System.err output.'))
}
}
}
compileJava.dependsOn += wsdl2java
sourceSets.main.java.srcDirs = ['src/main/java', 'build/generated-sources/cxf-ws']
评论版本
plugins {
id 'java'
id 'project-report' // really useful to find out what gets pulled in transitively
}
repositories {
jcenter()
}
// works with 1.8, 9, 10 and should be working with 11.
sourceCompatibility = 10
targetCompatibility = 10
configurations {
wsdl2java
}
dependencies {
compile 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.2'
compile 'org.apache.cxf:cxf-rt-transports-http:3.2.2'
compile 'javax.xml.ws:jaxws-api:2.3.0'
compile 'javax.jws:jsr181-api:1.0-MR1'
compile 'javax.xml.bind:jaxb-api:2.3.0'
//
// You might have these already imported due to other dependencies, but
compile 'javax.activation:javax.activation-api:1.2.0'
compile 'javax.annotation:javax.annotation-api:1.3'
// ===== Apache CXF dependencies for the command line generation of java files
//
// http://openjdk.java.net/jeps/320
// this JEP lists out exactly which dependencies are required to avoid using
// deprecated Java EE modules.
//
// JAXB dependencies that Apache CXF cxf-tools-wsdlto-databinding-jaxb uses directly
// we list them here all so we have a single version 2.3.0 among all of them
wsdl2java 'javax.xml.bind:jaxb-api:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-ri:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-xjc:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-core:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-impl:2.3.0'
//
// Other stuff that Apache CXF assume to be available from the JDK
wsdl2java 'javax.activation:javax.activation-api:1.2.0'
wsdl2java 'javax.annotation:javax.annotation-api:1.3'
wsdl2java 'javax.xml.ws:jaxws-api:2.3.0'
wsdl2java 'javax.jws:jsr181-api:1.0-MR1'
//
// This is the big lazy solution and it puts the whole jaxws-ri stack on the classpath
// As this is just the isolated classpath for wsdl2java you might not care.
// This might be useful when you have missing dependencies with the above reduceded
// list of dependencies. the Gradle plugin "project-report" has a task "projectReport"
// that can really help
//wsdl2java('com.sun.xml.ws:jaxws-ri:2.3.0') {
//
// this dependency is broken in 2.3.0. This articaft is simply not on mavenCentral
// or jcenter. It looks like the correct one would be
// 'org.eclipse.persistence:commonj.sdo:2.1.1' but we are not in the postion
// to change this. As we are not interested in any JPA integration anyways we
// just skip it for now.
//exclude group: 'commonj.sdo', module: 'commonj.sdo'
//}
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:3.2.2'
}
//
// there is no real Gradle plugin here, we rather use Gradle's build in task JavaExec
// which is the Gradle way to call an external java program.
def wsdl2java = task generateJavaFromWsdl(type: JavaExec) {
String wsdl = 'src/main/resources/some.wsdl'
String genSrcDir = "${projectDir}/build/generated-sources/cxf-ws"
inputs.file wsdl
outputs.dir genSrcDir
classpath configurations.wsdl2java
main "org.apache.cxf.tools.wsdlto.WSDLToJava"
// you can add any of the Apache CXF command line parameters here
// http://cxf.apache.org/docs/wsdl-to-java.html
args '-encoding', 'UTF-8', '-d', genSrcDir, wsdl
// you can set jvmArgs as well. F.i. proxy
//jvmArgs "-Dhttp.proxyHost=10.10.10.10", "-Dhttp.proxyPort=8080"
OutputStream baos = new ByteArrayOutputStream()
errorOutput = new OutputStream() {
// extrem simplified TeeOutputStream to avoid dependency on Apache commons-io
void write(int b) {System.err.write(b); baos.write(b) }
// no need to call flush and close on a ByteArrayOutputStream, but lets be safe
void flush() { System.err.flush(); baos.flush() }
void close() { System.err.close(); baos.close() }
}
// We inspect the collected logging an throw an TaskExecutionException if necessary.
doLast {
String str = baos.toString()
if (str.contains('Usage : wsdl2java') || str.contains('WSDLToJava Error')) {
throw new TaskExecutionException(tasks[name],
new IOException('Apache CXF WSDLToJava has failed. Please see System.err output.'))
}
}
}
// we hook the custom task wsdl2java into the Gradle tasks graph / life cycle
compileJava.dependsOn += wsdl2java
// usually we want to access the generated code in the main source set and IDE's
sourceSets.main.java.srcDirs = ['src/main/java', 'build/generated-sources/cxf-ws']
我正在尝试复制此插件在 Gradle 中的作用。如果我执行:
./wsdl2java -encoding UTF-8 -d /src/target/generated-sources/cxf -fe jaxws21
-sn UserSoapServicePorts -faultSerialVersionUID 1 -xjc-Xannotate
-p http:... -p urn:... -p urn:... -p urn:... -p urn:h... -p urn:...
-p urn:... -p urn:...
-verbose /src/xmlTemp/user-soap-v1.wsdl
...然后我得到:
an 22, 2016 3:51:05 PM org.apache.cxf.wsdl11.WSDLServiceBuilder checkForWrapped
INFO: Operation {urn:stuff:wsdl:person:v1}doSomething cannot be unwrapped, input message must reference global element declaration with same localname as operation
据我所知,虽然线条是相同的。有什么想法可能是错误的吗?
使用
buildscript {
ext {
xjcVersion= '3.0.5'
jaxbOutputDir = "$buildDir/generated/cxf"
jaxb2BasicsVersion = '0.11.0'
}
}
configurations {
cxf
}
apply plugin: 'java'
apply plugin: 'eclipse'
sourceSets {
main {
java {
srcDirs += "$jaxbOutputDir"
}
}
}
task wsdl2java(type: JavaExec) {
ext {
outputDir = file("$jaxbOutputDir")
}
systemProperties = ['javax.xml.accessExternalSchema': 'file' , 'file.encoding':'UTF8']
outputs.upToDateWhen { false }
outputs.dir outputDir
main = 'org.apache.cxf.tools.wsdlto.WSDLToJava'
classpath = project.configurations.cxf
args '-d', outputDir
args '-fe', 'jaxws21'
args '-client'
args '-verbose'
args '-validate'
args '-mark-generated'
// args '-xjc-X'
args '-xjc-Xfluent-api'
args '-xjc-Xts'
args '-xjc-XhashCode'
args '-xjc-Xequals'
args '-b',"$projectDir/src/main/resources/jaxws-custom-bindings.xjb"
args "$projectDir/src/main/resources/wsdl/myWsdl.wsdl"
doLast {
println "----- cxf jaxb2 files generated -----"
}
}
dependencies {
cxf "org.apache.cxf:cxf-tools-wsdlto-core:$cxfVersion"
cxf "org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:$cxfVersion"
cxf "org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:$cxfVersion"
cxf "org.jvnet.jaxb2_commons:jaxb2-fluent-api:3.0"
cxf "org.apache.cxf.xjcplugins:cxf-xjc-ts:$xjcVersion"
cxf "org.jvnet.jaxb2_commons:jaxb2-basics:$jaxb2BasicsVersion"
compile "org.apache.cxf.xjc-utils:cxf-xjc-runtime:$xjcVersion"
compile "org.jvnet.jaxb2_commons:jaxb2-basics-runtime:$jaxb2BasicsVersion"
compile 'commons-lang:commons-lang:2.6'
}
compileJava.dependsOn wsdl2java
玩得开心。
这个答案类似于 Stefan K 的方法,但适用于 Java 10 和 Gradle 4.6,并且与 Maven 插件 cxf-codegen-plugin.[=18= 大致相同]
此解决方案基于 2013 年 mooregreatsoftware.com 的博客 post Generated Files in Gradle。不同之处在于
- 通过在 Groovy 中实现非常简单的
- 它被修改为与 Java 9、10 和潜在的 11 一起工作。
TeeOutputStream
内联,避免了构建脚本对 commons-io:commons-io
的依赖
主要动机之一是 JEP 320: Remove the Java EE and CORBA Modules,计划在 Java 11。有一些方法可以让 Java 9 和 Java 10 使用--add-modules java.se.ee
之类的东西,但 JEP 320 声明:
Since standalone versions of the Java EE technologies are readily available from third-party sites, such as Maven Central, there is no need for the Java SE Platform or the JDK to include them.
这里有两个代码清单,第一个是完成工作的更紧凑的代码。第二个代码清单是相同的代码,但带有注释并注释掉了您可能想要覆盖的传递依赖项。
较短的版本
plugins {
id 'java'
id 'project-report'
}
repositories {
jcenter()
}
sourceCompatibility = 10
targetCompatibility = 10
configurations {
wsdl2java
}
dependencies {
compile 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.2'
compile 'org.apache.cxf:cxf-rt-transports-http:3.2.2'
compile 'javax.xml.ws:jaxws-api:2.3.0'
compile 'javax.jws:jsr181-api:1.0-MR1'
compile 'javax.xml.bind:jaxb-api:2.3.0'
compile 'javax.activation:javax.activation-api:1.2.0'
compile 'javax.annotation:javax.annotation-api:1.3'
wsdl2java 'javax.xml.bind:jaxb-api:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-ri:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-xjc:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-core:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-impl:2.3.0'
wsdl2java 'javax.activation:javax.activation-api:1.2.0'
wsdl2java 'javax.annotation:javax.annotation-api:1.3'
wsdl2java 'javax.xml.ws:jaxws-api:2.3.0'
wsdl2java 'javax.jws:jsr181-api:1.0-MR1'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:3.2.2'
}
def wsdl2java = task generateJavaFromWsdl(type: JavaExec) {
String wsdl = 'src/main/resources/some.wsdl'
String genSrcDir = "${projectDir}/build/generated-sources/cxf-ws"
inputs.file wsdl
outputs.dir genSrcDir
classpath configurations.wsdl2java
main "org.apache.cxf.tools.wsdlto.WSDLToJava"
args '-encoding', 'UTF-8', '-d', genSrcDir, wsdl
OutputStream baos = new ByteArrayOutputStream()
errorOutput = new OutputStream() {
void write(int b) {System.err.write(b); baos.write(b) }
void flush() { System.err.flush(); baos.flush() }
void close() { System.err.close(); baos.close() }
}
doLast {
def str = baos.toString()
if (str.contains('Usage : wsdl2java') || str.contains('WSDLToJava Error')) {
throw new TaskExecutionException(tasks[name],
new IOException('Apache CXF WSDLToJava has failed. Please see System.err output.'))
}
}
}
compileJava.dependsOn += wsdl2java
sourceSets.main.java.srcDirs = ['src/main/java', 'build/generated-sources/cxf-ws']
评论版本
plugins {
id 'java'
id 'project-report' // really useful to find out what gets pulled in transitively
}
repositories {
jcenter()
}
// works with 1.8, 9, 10 and should be working with 11.
sourceCompatibility = 10
targetCompatibility = 10
configurations {
wsdl2java
}
dependencies {
compile 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.2'
compile 'org.apache.cxf:cxf-rt-transports-http:3.2.2'
compile 'javax.xml.ws:jaxws-api:2.3.0'
compile 'javax.jws:jsr181-api:1.0-MR1'
compile 'javax.xml.bind:jaxb-api:2.3.0'
//
// You might have these already imported due to other dependencies, but
compile 'javax.activation:javax.activation-api:1.2.0'
compile 'javax.annotation:javax.annotation-api:1.3'
// ===== Apache CXF dependencies for the command line generation of java files
//
// http://openjdk.java.net/jeps/320
// this JEP lists out exactly which dependencies are required to avoid using
// deprecated Java EE modules.
//
// JAXB dependencies that Apache CXF cxf-tools-wsdlto-databinding-jaxb uses directly
// we list them here all so we have a single version 2.3.0 among all of them
wsdl2java 'javax.xml.bind:jaxb-api:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-ri:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-xjc:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-core:2.3.0'
wsdl2java 'com.sun.xml.bind:jaxb-impl:2.3.0'
//
// Other stuff that Apache CXF assume to be available from the JDK
wsdl2java 'javax.activation:javax.activation-api:1.2.0'
wsdl2java 'javax.annotation:javax.annotation-api:1.3'
wsdl2java 'javax.xml.ws:jaxws-api:2.3.0'
wsdl2java 'javax.jws:jsr181-api:1.0-MR1'
//
// This is the big lazy solution and it puts the whole jaxws-ri stack on the classpath
// As this is just the isolated classpath for wsdl2java you might not care.
// This might be useful when you have missing dependencies with the above reduceded
// list of dependencies. the Gradle plugin "project-report" has a task "projectReport"
// that can really help
//wsdl2java('com.sun.xml.ws:jaxws-ri:2.3.0') {
//
// this dependency is broken in 2.3.0. This articaft is simply not on mavenCentral
// or jcenter. It looks like the correct one would be
// 'org.eclipse.persistence:commonj.sdo:2.1.1' but we are not in the postion
// to change this. As we are not interested in any JPA integration anyways we
// just skip it for now.
//exclude group: 'commonj.sdo', module: 'commonj.sdo'
//}
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-core:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:3.2.2'
wsdl2java 'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:3.2.2'
}
//
// there is no real Gradle plugin here, we rather use Gradle's build in task JavaExec
// which is the Gradle way to call an external java program.
def wsdl2java = task generateJavaFromWsdl(type: JavaExec) {
String wsdl = 'src/main/resources/some.wsdl'
String genSrcDir = "${projectDir}/build/generated-sources/cxf-ws"
inputs.file wsdl
outputs.dir genSrcDir
classpath configurations.wsdl2java
main "org.apache.cxf.tools.wsdlto.WSDLToJava"
// you can add any of the Apache CXF command line parameters here
// http://cxf.apache.org/docs/wsdl-to-java.html
args '-encoding', 'UTF-8', '-d', genSrcDir, wsdl
// you can set jvmArgs as well. F.i. proxy
//jvmArgs "-Dhttp.proxyHost=10.10.10.10", "-Dhttp.proxyPort=8080"
OutputStream baos = new ByteArrayOutputStream()
errorOutput = new OutputStream() {
// extrem simplified TeeOutputStream to avoid dependency on Apache commons-io
void write(int b) {System.err.write(b); baos.write(b) }
// no need to call flush and close on a ByteArrayOutputStream, but lets be safe
void flush() { System.err.flush(); baos.flush() }
void close() { System.err.close(); baos.close() }
}
// We inspect the collected logging an throw an TaskExecutionException if necessary.
doLast {
String str = baos.toString()
if (str.contains('Usage : wsdl2java') || str.contains('WSDLToJava Error')) {
throw new TaskExecutionException(tasks[name],
new IOException('Apache CXF WSDLToJava has failed. Please see System.err output.'))
}
}
}
// we hook the custom task wsdl2java into the Gradle tasks graph / life cycle
compileJava.dependsOn += wsdl2java
// usually we want to access the generated code in the main source set and IDE's
sourceSets.main.java.srcDirs = ['src/main/java', 'build/generated-sources/cxf-ws']