gpt4 book ai didi

gradle - 来自buildSrc中定义的Task的Gradle传递依赖项

转载 作者:行者123 更新时间:2023-12-03 03:15:47 24 4
gpt4 key购买 nike

我想使我的构建中的所有子项目都可以访问任务。任务ant执行依赖于jaxb-xjc JAR,并且提供给ant的类路径必须包含jaxb-xjc。

我的意见:
使用jaxb-xjc依赖项的自定义配置创建一个/buildSrc/build.gradle:

configurations {
jaxb
}
repositories {
mavenCentral()
}
dependencies {
jaxb 'com.sun.xml.bind:jaxb-xjc:2.2.4-1'
}

然后在/ buildSrc下创建使用jaxb配置中的类路径的任务:
class JaxbTask extends DefaultTask {
...
@TaskAction
def main() {
...
ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: project.configurations.jaxb.asPath)
...
}
}

但是,project.configurations最终使用任务类引用项目,而不是/buildSrc/build.gradle的配置。因此,使该任务起作用的唯一方法是使jaxb配置+对使用该任务的所有项目具有依赖性。
  • 是否可以使任务引用/buildSrc/build.gradle配置类路径?
  • 是否可以避免使用该任务的项目对jaxb-xjc的依赖性?
  • 最佳答案

    新解决方案

    实际上,在考虑这一点时,我发现了一个比以前更好的解决方案,我对此感到非常满意,并且不应以任何方式干扰实际项目的构建。

    build.gradle项目的buildSrc中:

    configurations {
    wsimport
    xjc
    }

    dependencies {
    wsimport 'com.sun.xml.ws:jaxws-tools:2.1.4'
    xjc 'com.sun.xml.bind:jaxb-xjc:2.2.4-1'
    }

    def generatedResourcesDirectory = "$buildDir/resources/generated"

    task generateClasspathsPropertiesFile {
    inputs.file configurations.wsimport
    inputs.file configurations.xjc
    def outputFile = file("$generatedResourcesDirectory/classpaths.properties")
    outputs.file outputFile
    doLast {
    def classpaths = new Properties()
    classpaths.wsimport = configurations.wsimport.asPath
    classpaths.xjc = configurations.xjc.asPath
    outputFile.parentFile.mkdirs()
    outputFile.withOutputStream { classpaths.store it, null }
    }
    }

    sourceSets.main.output.dir generatedResourcesDirectory, builtBy: generateClasspathsPropertiesFile

    然后在各自的任务中:
    class Xjc extends DefaultTask {
    ...

    @TaskAction
    def xjc() {
    ...

    def classpaths = new Properties()
    getClass().getResource('/classpaths.properties').withInputStream { classpaths.load it }
    ant.taskdef name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: classpaths.xjc
    ant.xjc ...

    ...
    }
    }
    class Wsimport extends DefaultTask {
    ...

    @TaskAction
    def wsimport() {
    ...

    def classpaths = new Properties()
    getClass().getResource('/classpaths.properties').withInputStream { classpaths.load it }
    ant.taskdef name: 'wsimport', classname: 'com.sun.tools.ws.ant.WsImport', classpath: classpaths.wsimport
    ant.wsimport ...

    ...
    }
    }

    旧解决方案

    我目前如何解决这种情况-尽管我不太满意-除了需要应用的任务外,还有一个插件:
    class XjcPlugin implements Plugin<Project> {
    static final CONFIGURATION_NAME = "xjc_${System.currentTimeMillis()}"

    @Override
    void apply(Project project) {
    project.configurations.create(CONFIGURATION_NAME) { visible: false }

    project.dependencies {
    "$CONFIGURATION_NAME" group: 'com.sun.xml.bind', name: 'jaxb-xjc', version: '2.2.4-1'
    }
    }
    }
    class Xjc extends DefaultTask {
    ...

    @TaskAction
    def xjc() {
    if (!project.configurations.hasProperty(XjcPlugin.CONFIGURATION_NAME)) {
    throw new ConfigurationException("xjc configuration is missing on project ${project.name}, did you forget to apply XjcPlugin?")
    }
    ...
    def runClassPath = project.configurations."$XjcPlugin.CONFIGURATION_NAME".asPath
    ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: runClassPath)
    ant.xjc(...)
    }
    }

    但是请注意,像 configurations.all { ... }nebula-dependency-recommender-plugin这样的内容也会影响这些配置,并且可能会产生意外的结果。

    关于gradle - 来自buildSrc中定义的Task的Gradle传递依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25160105/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com