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

时间:2014-04-30 20:27:38

标签: java android ant gradle android-studio

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

该任务作为dependency

的一部分进行调用

的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结束,我已经链接到我遇到问题的特定提交:Source Repository

1 个答案:

答案 0 :(得分:2)

好吧,花了一段时间才得到我很满意的版本。但是,这是改变了什么。

JAR的实际构建是使用相同的样式构建的,但是移动到外部项目(因此主构建项目没有达到它)。我将在下面给出一个深入的解释,但提交是herehere。这些都是有序的。

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

build.gradle 外部项目

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
    }
}

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

build.gradle 主要项目

compile project(path: ':jsword-minimalbible', configuration: 'buildJSword')

希望这对遇到类似问题的人有所帮助,如果您有任何疑问请与我联系!

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