在gradle中使用ant XJC从JAR编译多个XSD

在gradle中使用ant XJC从JAR编译多个XSD,gradle,jaxb,xjc,Gradle,Jaxb,Xjc,因此,我能够使用ant xjc从契约jar中的一个xsd生成类。 如何从这个jar从多个模式中生成类,而不将其解包 ant.xjc(package: packageName, destdir: project.ext.generatedSrcDir, extension: 'true', schema: "jar:file:///$pathToContractJar!/MySchema.xsd") 我用了很长一段时间,但我发现转移到Java11/Gradle6后,它就不再工作了。

因此,我能够使用ant xjc从契约jar中的一个xsd生成类。 如何从这个jar从多个模式中生成类,而不将其解包

 ant.xjc(package: packageName, destdir: project.ext.generatedSrcDir,    
 extension: 'true',
 schema: "jar:file:///$pathToContractJar!/MySchema.xsd")

我用了很长一段时间,但我发现转移到Java11/Gradle6后,它就不再工作了。Java 11没有JAXB API,因此需要将其作为依赖项添加。另外,在Gradle内部使用Ant调用XJC的机制也不想起作用,可能我只是没有找到标志的神奇组合!相反,可以调用JAR清单中列出的XJC主类,完全去掉Ant。这里的配置适合我使用Gradle6.3和Java11

我还没有尝试在JAR+绑定文件中使用这种方法,但是参数是根据使用信息提供的,所以应该可以使用

更新:根据


我用了很长一段时间,但我发现转移到Java11/Gradle6后,它就不再工作了。Java 11没有JAXB API,因此需要将其作为依赖项添加。另外,在Gradle内部使用Ant调用XJC的机制也不想起作用,可能我只是没有找到标志的神奇组合!相反,可以调用JAR清单中列出的XJC主类,完全去掉Ant。这里的配置适合我使用Gradle6.3和Java11

我还没有尝试在JAR+绑定文件中使用这种方法,但是参数是根据使用信息提供的,所以应该可以使用

更新:根据


没有时间给出完整的答案,只是一个简短的提示。您可以使用目录文件将绝对模式URL重写为其他URL。因此,您可以编写一个目录文件来重写模式info
jar的URL:fille:///..
URL,然后使用XJC编译绝对URL。我在Maven中使用了这个技巧,但它也应该在Gradle中使用。目录文件?像windows目录文件?我不明白不,就像XML目录文件一样。请参阅或。我发现了另一个XJC任务:没有时间给出完整的答案,只是一个简短的提示。您可以使用目录文件将绝对模式URL重写为其他URL。因此,您可以编写一个目录文件来重写模式info
jar的URL:fille:///..
URL,然后使用XJC编译绝对URL。我在Maven中使用了这个技巧,但它也应该在Gradle中使用。目录文件?像windows目录文件?我不明白不,就像XML目录文件一样。请参阅或。我找到了另一个XJC任务:谢谢@lance java。我正在整个互联网上搜索一种在
System.setProperty('javax.xml.accessExternalSchema','all')
中添加此参数的方法,在您的代码片段中找到了它。谢谢@lance java。我正在搜索整个互联网,寻找在
System.setProperty('javax.xml.accessExternalSchema','all')
中添加此参数的方法,在您的代码片段中找到了它。
configurations {
    jaxb
}
dependencies {
    jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.6'
    jaxb 'com.sun.xml.bind:jaxb-impl:2.2.6'
    jaxb 'javax.xml.bind:jaxb-api:2.2.6'    
}
task xjc {
    def xsds = zipTree(pathToContractJar).matching { 
        include: '*.xsd' 
    }
    inputs.dir "src/main/resources/bindings"
    inputs.files xsds
    outputs.dir "$buildDir/xjc"
    doLast {
        System.setProperty('javax.xml.accessExternalSchema', 'all')
        mkdir "$buildDir/xjc/result"
        mkdir "$buildDir/xjc/xsd"

        copy {
            from xsds
            into "$buildDir/xjc/xsd"
        }
        ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath)
        ant.xjc(
            destdir: "$buildDir/xjc/result",
            package: packageName,
        ) {
            schema(dir: "$buildDir/xjc/xsd", includes: '*.xsd')
            binding(dir: "src/main/resources/bindings", includes: '*.xjb')
            arg(value: '-verbose')
        }
    }
}
sourceSets {

    generated {
        java.srcDir "$generated_dir"
    }
}

dependencies {

    compile sourceSets.generated.output

    // Generated code depends on the JAXB API, which is removed from base Java in JDK 11
    compile "org.glassfish.jaxb:jaxb-runtime:2.3.3"
    generatedCompile "org.glassfish.jaxb:jaxb-runtime:2.3.3"
}


// XJC tasks

// JAXB configuration holds classpath for running the JAXB XJC compiler
configurations {
    jaxb
}

dependencies {

    jaxb "org.glassfish.jaxb:jaxb-xjc:2.3.3"
}

// Cookie cutter function for defining multiple XJC tasks
// (not necessary if you only have a single task)!
def addXjcTask(taskName, schema, pkg, dest) {

    // If you haven't already, create the generated output dir before running XJC or it will fail
    file(dest).mkdirs()

    // The main XJC task, calls XJCFacade which is the entry point of the XJC JAR
    tasks.create(name: taskName, type: JavaExec) {

        classpath configurations.jaxb
        main 'com.sun.tools.xjc.XJCFacade'

        // To explore available args, download the XJC JAR and run java -jar jaxb-xjc.jar --help
        args schema, "-p", pkg, "-d", dest
    }

    // Add a dependency on the new task so it gets invoked
    compileGeneratedJava.dependsOn tasks.getByName(taskName)
}

// Add all the XJC tasks you need

addXjcTask("xjcSchema1",
        "path/to/schema1.xsd",
        'com.example.generated.schema1',
        "$generated_dir")

addXjcTask("xjcSchema2",
        "path/to/schema2.xsd",
        'com.example.generated.schema2',
        "$generated_dir")