Gradle WSDL генерации

Я хочу создавать файлы Java из WSDL. Я пытаюсь использовать wsdl2java Gradle плагин. Я определяю плагин:

subprojects {
buildscript{
    repositories{
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'no.nils:wsdl2java:0.10'
    }
}


apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
apply plugin: 'application'
apply plugin: 'no.nils.wsdl2java'
....
}

но я получил эту ошибку:

> Plugin with id 'no.nils.wsdl2java:no.nils:wsdl2java' not found.

Я проверил синтаксис (много раз это хорошо). Я гуглил плагин, он используется многими людьми.

У кого-нибудь есть идея, что идет не так?

Upd:

У меня есть основной Gradle, где определены плагины, и есть три подпроекта, где я хочу использовать этот плагин.

Я определил подпроекты в settings.gradle:

include 'project1', 'project2', 'project3'

Я сделал папку и build.gradle файл для каждого проекта.

Если бы я закомментировал apply plugin: 'no.nils.wsdl2java' в основном build.gradle и wsdl2java Методы в подпроектах Gradle работает отлично.

6 ответов

Решение

Вы добавляете buildscript внутри subprojects-прикрытие, которое не поддерживается, см. это обсуждение Gradle (Buildscript {} в подпроектах {} игнорируется?).

Вам не нужно добавлять buildscript для каждого проекта, достаточно просто объявить его в root-build.gradle

buildscript{
    repositories{
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'no.nils:wsdl2java:0.10'
    }
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'maven-publish'
    apply plugin: 'application'
    apply plugin: 'no.nils.wsdl2java'
    ....
}

Я смог заставить работать wsdl2 java в моей сборке gradle с задачами jaxws и ant. Вот

apply plugin: 'java'

repositories {
    mavenCentral()
    flatDir {
       dirs 'lib'
   }
}

configurations { jaxws }
dependencies { jaxws 'com.sun.xml.ws:jaxws-tools:2.2.6' }

dependencies {
    compile 'com.sun.xml.bind:jaxb-impl:2.2.6'
}


task generateSCMOrderImportServiceClient{
    if(!file("./lib/employee-services-client.jar").exists()) {

        def rootDir = file("build/wsdlToJava/employee-services-client");
        def javaDir = file("${rootDir}/java");
        def wsdlJarDir = file("${projectDir}/lib");
        def classesDir = file("${rootDir}/classes");
        def wsdlDir=file("${projectDir}/src/main/resources/wsdl");
        def wsdlFile = file("${wsdlDir}/employee-services.wsdl")

        doLast{
            classesDir.mkdirs()
            javaDir.mkdirs()
            wsdlJarDir.mkdirs()
            copy {
                from "${wsdlFile}"
                into "${classesDir}"
            }

            ant {
                    taskdef(name: 'wsimport',
                            classname: 'com.sun.tools.ws.ant.WsImport',
                            classpath: configurations.jaxws.asPath)
                    wsimport(keep: true,
                            destdir: classesDir,
                            sourcedestdir: javaDir,
                            extension: "true",
                            verbose: "true",
                            quiet: "false",
                            xnocompile: "false",
                            xendorsed: true,
                            wsdlLocation: "EmployeeServices.wsdl",
                            wsdl: "${wsdlFile}") 
                    {
                        binding(dir:"${wsdlDir}", includes:"jaxb-bindings.xml,jaxws-bindings.xml")
                        xjcarg(value: "-XautoNameResolution")
                    }
            }

            ant.jar(
                    destfile: wsdlJarDir.path + "/employee-services-client.jar",
                    basedir: classesDir
            )
        }
     }

}



compileJava.dependsOn generateSCMOrderImportServiceClient

Я выполнил эту задачу, используя этот репозиторий git. Файл build.gradle выглядит примерно так.

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'no.nils:wsdl2java:0.10'
    }
}

plugins {
    id 'org.springframework.boot' version '2.2.0.M6'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'no.nils.wsdl2java' version '0.10'
}

group = 'your.application.groupname'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
    wsdl2java(
            'com.sun.xml.bind:jaxb-xjc:2.3.0.1',
            'javax.xml.bind:jaxb-api:2.3.1',
            'javax.xml.ws:jaxws-api:2.3.1',
            'org.apache.cxf:cxf-rt-wsdl:3.2.7',
            'javax.jws:javax.jws-api:1.1',

            'com.sun.xml.bind:jaxb-core:2.3.0.1',
            'com.sun.xml.bind:jaxb-xjc:2.3.2',
            'com.sun.xml.bind:jaxb-impl:2.3.2',
            'javax.xml.bind:jaxb-api:2.3.1'
    )

    implementation 'com.sun.xml.bind:jaxb-core:2.3.0.1'
    implementation 'com.sun.xml.bind:jaxb-xjc:2.3.0.1'
    implementation 'com.sun.xml.bind:jaxb-impl:2.3.2'
    implementation 'javax.xml.bind:jaxb-api:2.3.1'
    implementation 'javax.xml.ws:jaxws-api:2.3.1'
    implementation 'org.apache.cxf:cxf-rt-wsdl:3.2.7'
    implementation 'javax.jws:javax.jws-api:1.1'
}

test {
    useJUnitPlatform()
}

wsdl2java {
    wsdlsToGenerate = [
            ['-p', 'your.package.name',
             '-autoNameResolution', "$projectDir/src/main/resources/wsdl/some_wsdl_file.wsdl"]
    ]
    generatedWsdlDir = file("$projectDir/src/main/java")
    wsdlDir = file("$projectDir/src/main/resources/wsdl")
    locale = Locale.ENGLISH
}

wsdl2javaExt {
    cxfVersion = "2.5.1"
}

Чтобы сгенерировать код Java, нам нужно запустить задачу gradle, как показано ниже.

$ gradlew wsdl2java

Для всех, кто хочет создавать с помощью Apache CXF. Я старался избегать использования каких-либо плагинов. Я сделал это, создав конфигурацию с зависимостями, внешний массив строк с именами файлов wsdl, а затем просто использовал его следующим образом:

ext {
    wsdlDir = file("${projectDir}/src/main/resources/wsdl")
    outputDir = file("$buildDir/generated-sources")
    sourceWsdls = [
            "$wsdlDir/MyWsdlFile1.wsdl",
            "$wsdlDir/MyWsdlFile2.wsdl",
            "$wsdlDir/MyWsdlFile3.wsdl",
            "$wsdlDir/MyWsdlFile4.wsdl"
    ]
}

sourceSets.main.java.srcDirs += "$outputDir"

dependencies {
    cxf (
            'org.apache.cxf:cxf-tools-wsdlto-core:3.3.6',
            'org.apache.cxf:cxf-tools-wsdlto-frontend-jaxws:3.3.6',
            'org.apache.cxf:cxf-tools-wsdlto-databinding-jaxb:3.3.6'
    )
}

task generateJavaClasses {
    doLast{
        sourceWsdls.each { wsdlFile ->
            javaexec {
                classpath configurations.cxf
                main = 'org.apache.cxf.tools.wsdlto.WSDLToJava'
                args '-d', outputDir
                args '-b', 'PATH/TO/BINDING/FILE.xjb'
                args wsdlFile
            }
        }
    }
}

Это просто вызов javaexec класса Apache CXF - все аргументы и параметры см. В документации.

Примечание. Если у вас есть папка с файлами wsdl, и вы хотите сгенерировать в ней классы из всех файлов wsdl, это еще проще и просто используйте ее так:

task generateJavaClassesAllWsdlFiles {
    doLast{
        // Find all wsdl files in directory defined in ext
        fileTree(wsdlDir).matching {
            include "*.wsdl"
        }.each {
            wsdlFile ->
                println "Generating " + wsdlFile
                javaexec {
                    classpath configurations.cxf
                    main = 'org.apache.cxf.tools.wsdlto.WSDLToJava'
                    args '-d', outputDir
                    args '-b', 'PATH/TO/BINDING/FILE.xjb'
                    args wsdlFile
                }
        }
    }
}

Я поместил все это в суть, если вы хотите увидеть его полностью, суть здесь.

для JDK8 вы можете обновить gradle следующим образом и указать cxfVersion в wsdl2java

      apply plugin: 'no.nils.wsdl2java'

wsdl2java {
    wsdlDir = file("$projectDir/src/main/resources/fooSchemas")
    cxfVersion = '3.3.2'
    wsdlsToGenerate = [
            ["$projectDir/src/main/resources/emailSchemas/FooService.wsdl"]
      ]
}

Чтобы решить эту проблему, попробуйте добавить buildScript перед объявлениями плагинов и применить плагин wsdl после блока плагинов, например:

    buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath 'no.nils:wsdl2java:0.10'
    }
}

plugins {
    id 'org.springframework.boot' version '2.1.7.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'war'
    id "org.sonarqube" version "2.7"
}

apply plugin: 'java'
apply plugin: 'no.nils.wsdl2java'
Другие вопросы по тегам