Java 动态地将JAR添加到Gradle依赖项

Java 动态地将JAR添加到Gradle依赖项,java,android,ant,gradle,android-studio,Java,Android,Ant,Gradle,Android Studio,目前,my build.gradle依赖于使用Ant构建的外部库。为了完成构建库的工作,我按照建议创建了一个任务来构建外部库,并将其复制到libs/文件夹中 该任务作为依赖项的一部分调用: build.gradle dependencies { compile fileTree('libs') { include '*.jar' builtBy 'myTask' } } task myTask (type: GradleBuild) { Grad

目前,my build.gradle依赖于使用Ant构建的外部库。为了完成构建库的工作,我按照建议创建了一个任务来构建外部库,并将其复制到libs/文件夹中

该任务作为
依赖项的一部分调用

build.gradle

dependencies {
    compile fileTree('libs') {
        include '*.jar'
        builtBy 'myTask'
    }
}

task myTask (type: GradleBuild) { GradleBuild antBuild ->
    antBuild.buildFile('external-stub.gradle')
    antBuild.tasks = ['clean', 'ivy.check', 'ivy.download', 'ivy.task', 'ivy',
    'init', 'mergeCode', 'compile', 'jar', 'copyJarsToProject']
}
然而,当编译实际运行时,我刚刚构建和复制的库不包括在依赖项中,大量编译错误就证明了这一点

我把图书馆放错地方了吗


完整build.gradle和相关文件已在Github上完成,我已链接到我遇到问题的特定提交:

好吧,我花了一段时间才获得一个我满意的构建。但是,这里有一些改变

JAR的实际构建是使用相同的样式构建的,但是移动到了外部项目(这样主构建项目就不会涉及到它)。下面我将给出一个深入的解释,但是提交是和。这些都是正确的

基本上,我们将jar导出为其他项目可以依赖的工件,而不是自己在jar上复制。这样,Ant构建运行和其他项目可以看到我们刚刚创建的Jar。这是第一次提交的结束。在第二次提交中,任务输出被标记为仅当Jar不存在时才需要重新生成。这是因为每当我尝试构建应用程序时,都需要几分钟来重新生成Jar,然后还要重新打包其他所有内容。代码如下:

build.gradle外部项目

然后,主项目只需将此项目添加为编译时依赖项:

build.gradle主项目

希望这对任何有类似问题的人都有帮助,如果有问题请告诉我


注意:构建当前未正确清理自身,因此,如果您更改外部项目中的任何代码,则需要删除外部Jar,以便所有内容都能正确地重新生成自身。

请注意,如果构建Jar预先存在于libs/目录中,则构建可以正常工作。也就是说,从一个干净的工作树开始,构建失败。失败后重新尝试构建是成功的,因为外部jar已经构建。为项目声明的依赖项在该项目之外没有任何影响,更不用说在该构建之外了。我理解。任务是构建外部库,该库将复制到当前项目。从理论上讲,当前项目应该依赖于刚刚生成的库。作为一个快速更新:使用Gradle 2需要我们将名称从doBuildJSword更改为compileJava
s/doBuildJSword/compileJava/
足以执行更改。
configurations {
    buildJSword
}

task doBuildJSword (type: GradleBuild) {
buildFile = 'jsword-stub.gradle'
tasks = ['clean', 'ivy.check', 'ivy.download', 'ivy.task', 'ivy',
    'init', 'mergeCode', 'compile', 'jar'] //, 'copyJarsToMinimalBible']
    ext.outputJar = file('distribution/jsword.jar')
    outputs.upToDateWhen {
        ext.outputJar.exists()
    }
}

artifacts {
    buildJSword(doBuildJSword.ext.outputJar) {
        builtBy doBuildJSword
    }
}
compile project(path: ':jsword-minimalbible', configuration: 'buildJSword')