我如何告诉Gradle包含一个本地库jar,而这个jar又依赖于它?

时间:2016-03-06 17:41:43

标签: java maven gradle jar build.gradle

我在阅读Gradle文档时肯定遗漏了一些东西,因为这感觉就像一个常见的用例。基本上,我有两个项目 - MyApp和MyLib。 MyApp将使用MyLib.jar作为依赖项。反过来,MyLib有自己的依赖jar - 在构建时,MyLib的build.gradle指定了这些。最后,MyLib.jar将只包含非依赖.class文件,因此MyApp将需要在编译时下载MyLib.jar的依赖项。

如何告诉MyApp的build.gradle包含MyLib.jar然后下载MyLib的依赖jar而不在MyApp的build.gradle中指定这些jar?我觉得MyApp的build.gradle不应该知道传递依赖。我理解通常,build.gradle会查看远程Maven / Ivy仓库并读取相应的xml以下载相应的传递依赖项,但我不想将MyLib上传到Maven / Ivy存储库。理想情况下,我想将MyLib.jar与一些描述符文件一起分发 - 例如pom.xml - 列出传递依赖项,但不一定打包为"存储库"。请参阅下图,了解我所指的内容:

Library jar dependencies

请注意,我计划分发MyLib.jar,而不是作为一组来源,而是作为一个封闭的jar,所以我不想设置多项目Gradle构建。此外,MyLib的依赖项可以在MavenCentral / etc存储库中找到,也可以在文件系统中与MyLib.jar一起存放。

1 个答案:

答案 0 :(得分:2)

您可以将您的库发布到本地隔离的maven存储库,然后分发该存储库(例如,作为存档),然后可以由gradle或maven使用。

注意:我正在使用gradle 2.11。

要为您的库创建存储库,我们将使用gradle的maven-publish plugin。您的图书馆的build.gradle将如下所示:

apply plugin: 'java'
apply plugin: 'maven-publish'

group = 'com.stackoverflow.phillip' // change it
version = '1.0' // whatever

dependencies {
    // ...
}

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
            // uncomment if you want to change artifact id (the default equals to project directory name)
            //artifactId 'my-lib'
        }
    }

    repositories {
        maven {
            url 'file:local-repo' // path is relative to project root
        }
    }
}

运行gradle publish后,将创建一个目录local-repo。该目录将是一个实际的maven存储库,只包含一个工件 - 您的库。当然,会有pom描述您的库的依赖关系。

现在,您可以在另一个项目的build.gradle中使用该存储库,例如:

repositories {
    mavenCentral()
    maven { url 'file:path/to/local-repo' } // path is relative to project root
}

dependencies {
    compile 'com.stackoverflow.phillip:my-lib:1.0'
}