【问题标题】:How do I tell Gradle to include a local library jar that in turn has dependencies?如何告诉 Gradle 包含一个本地库 jar,而该 jar 又具有依赖项?
【发布时间】:2016-06-20 04:52:36
【问题描述】:

我在阅读 Gradle 文档时肯定会遗漏一些东西,因为这感觉像是一个常见的用例。基本上,我有两个项目——MyApp 和 MyLib。 MyApp 将使用 MyLib.jar 作为依赖项。反过来,MyLib 也有自己的依赖 jars - 在构建时,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 - 列出传递依赖项,但不一定打包为“存储库”。请参阅下图以了解我所指的内容:

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

【问题讨论】:

  • 你为什么反对多项目设置?
  • @RaGe:实际上,我可以接受,但第二个项目将只包含一个 jar - MyLib.jar。它不包含任何源文件。为像 MyLib.jar 这样的每个一级依赖创建一个完整的项目感觉很尴尬
  • 多项目是一种方式,另一种方式是发布到本地 Ivy/Maven 存储库,因此您将获得一个声明依赖关系的 ivy.xml/pom.xml。
  • 你的最后一行听起来你可以将 myLib+所有依赖项的文件夹作为 jars 分发。您可以将 myApp 中的 jar 目录用作 compile files('/path/to/jars')
  • 为什么你不想使用 maven repo 分发?

标签: java maven gradle jar build.gradle


【解决方案1】:

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

注意:我使用的是 gradle 2.11。

要为您的库创建存储库,我们将使用 gradle 的 maven-publish pluginbuild.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'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2018-11-09
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多