Порт cxf-codegen-plugin для 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

Насколько я могу сказать, хотя линии идентичны. Есть идеи, что может быть не так?

2 ответа

Решение

Использование

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.

Это решение основано на публикации в блоге " Сгенерированные файлы в Gradle" от mooregreatsoftware.com 2013 года.

  • избегает зависимости сценария сборки от commons-io:commons-io реализуя очень простой TeeOutputStream встроенный в Groovy
  • он изменен для работы с Java 9, 10 и, возможно, 11.

Одним из основных мотивов является JEP 320: удалить модули Java EE и CORBA, которые запланированы для Java 11. Существуют способы заставить эту работу работать с Java 9 и Java 10 с помощью таких вещей, как --add-modules java.se.ee но JEP 320 заявляет:

Поскольку автономные версии технологий Java EE легко доступны на сторонних сайтах, таких как Maven Central, нет необходимости включать их в платформу Java SE или JDK.

Здесь есть два списка кодов, первый - более компактный код, который делает работу. Второй листинг кода - это тот же код, но с аннотациями и закомментированными переходными зависимостями, которые вы можете переопределить.

Более короткая версия

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']
Другие вопросы по тегам