为什么 Gradle 不在编译/运行时类路径中包含传递依赖项?

2024-03-19

我正在学习 Gradle 的工作原理,但我无法理解它如何解决项目传递依赖关系。

现在,我有两个项目:

  • projectA :它对外部库有一些依赖项
  • 项目:仅对项目有一个依赖项

无论我如何尝试,当我构建projectB时,gradle都不在projectB的编译或运行时类路径中包含任何projectA依赖项(X和Y)。我只能通过将projectA的依赖项包含在projectB的构建脚本中来使其工作,在我看来,这没有任何意义。这些依赖项应自动附加到projectB。我很确定我错过了一些东西,但我不知道是什么。

我读过有关“lib依赖项”的内容,但它似乎仅适用于所描述的本地项目here http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:project_jar_dependencies,而不是外部依赖。

这是我在根项目(同时包含projectA和projectB的项目)中使用的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.3'
    }
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'

    group = 'com.company'

    repositories {
        mavenCentral()
        add(new org.apache.ivy.plugins.resolver.SshResolver()) {
            name = 'customRepo'
            addIvyPattern "ssh://.../repository/[organization]/[module]/[revision]/[module].xml"
            addArtifactPattern "ssh://.../[organization]/[module]/[revision]/[module](-[classifier]).[ext]"
        }
    }

    sourceSets {
        main {
            java {
                srcDir 'src/'
            }
        }
    }

    idea.module { downloadSources = true }

    // task that create sources jar
    task sourceJar(type: Jar) {
        from sourceSets.main.java
        classifier 'sources'
    }

    // Publishing configuration
    uploadArchives {
        repositories {
            add project.repositories.customRepo
        }
    }

    artifacts {
        archives(sourceJar) {
            name "$name-sources"
            type 'source'
            builtBy sourceJar
        }
    }
}

这仅涉及项目A:

version = '1.0'
dependencies {
    compile 'com.company:X:1.0'
    compile 'com.company:B:1.0'
}

这是projectB 使用的:

version = '1.0'
dependencies {
    compile ('com.company:projectA:1.0') {
        transitive = true
    }
}

预先感谢您的帮助,请为我糟糕的英语道歉。


我知道这个问题的具体版本已经解决了,但是我的搜索把我带到了这里,我希望我可以为一些人省去解决这个问题的麻烦。

Bad foo/build.gradle

dependencies {
    implementation 'com.example:widget:1.0.0'
}

Good foo/build.gradle

dependencies {
    api 'com.example:widget:1.0.0'
}

bar/build.gradle

dependencies {
    implementation project(path: ':foo')
}

implementation隐藏小部件依赖项。

api使小部件依赖项具有传递性。


From https://stackoverflow.com/a/44493379/68086 https://stackoverflow.com/a/44493379/68086:

来自Gradle 文档 https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation:

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

出现在的依赖关系api配置将是 间接地暴露给图书馆的消费者,因此将 出现在消费者的编译类路径上。

发现依赖关系implementation配置将在 另一方面,不会暴露给消费者,因此不会泄漏到 消费者的编译类路径。这有几个好处:

  • 依赖项不会再泄漏到消费者的编译类路径中,因此您永远不会意外地依赖于传递性 依赖性
  • 由于类路径大小减小,编译速度更快
  • 当实现依赖关系发生变化时,重新编译次数减少:消费者不需要重新编译
  • 更干净的发布:当与新的 maven-publish 插件结合使用时,Java 库会生成以下 POM 文件: 准确区分编译所需的内容 库以及在运行时使用该库需要什么(在其他情况下) 换句话说,不要混合编译库本身所需的内容和 需要针对库进行编译)。

编译配置仍然存在,但不应使用,因为它不能保证api and implementation配置提供。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Gradle 不在编译/运行时类路径中包含传递依赖项? 的相关文章

  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 无法解决dll之间的冲突

    我在构建中收到类似于以下内容的警告墙 No way to resolve conflict between Newtonsoft Json Version 7 0 0 0 and Newtonsoft Json Version 6 0 0
  • 有没有什么好的工具可以查看和浏览ant构建文件?

    我发现很难读取 ant 构建文件 特别是如果构建文件包含大量导入文件 例如属性文件和其他 xml 构建文件 因此 我想知道是否有一些好的工具可以提供帮助 例如在 IDE 中查看和浏览源代码 提前致谢 Try 盛大 这里 http www g
  • Renderscript 示例构建错误

    所以我想尝试使用 RenderScript 的示例 并在 Eclipse 中导入了 HelloWorld 但它给了我这样的错误 2011 10 25 13 10 48 HelloWorld home mileoresko workspace
  • 无法使用 build auto 和 tfs 13 修改 .csproj 文件

    我创建了一个名为的工作流活动EditCsproj这是我添加到构建模板中的 C 类 我把它放在后面Initialize Workspace step 此工作流程必须获取所有 csproj我作为参数提供的目录路径中的文件 并且必须修改它们 但对
  • JavaScript 的依赖管理和构建工具

    我有许多跨多个项目共享的 JS snippets 和 文件 我必须将它们复制粘贴到每个项目的单个文件中 或者将它们作为 CDN 上的单独文件提供 两者都是坏主意 有没有类似 Maven for JavaScript 的依赖管理和构建工具 理
  • 无法创建 TFS 构建定义 (TF225000) 并且没有构建管理员组

    我无法在 TFS 2013 团队项目上创建构建定义 因为出现错误 我在项目管理员组中 我被添加到项目集合构建管理员组作为一种可能的解决方法 但我仍然遇到相同的错误 团队项目没有 构建管理员 组 这是一个明显的缺陷项目级组 https msd
  • gradle 复制为 doLast 不起作用

    我正在尝试做一件非常简单的事情 由于 gradle 在清理时会删除构建目录中的所有文件 因此我想在创建发布版本时将 apk 移至其他位置 所以我在链中添加了一个复制任务 并将其设置为最后一个 我尝试过的任何方法都不起作用 所以我简化了它并添
  • 如何在 Xcode 中自动增加内部版本号 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在这个网站上找到了很多解决方案和脚本 但在 Xcode 中增加构建号的最简单的解决方案是 转到 TARGETS 部分中的 Build P
  • 在未安装 docker 的情况下构建 docker 镜像

    是否可以在不安装 docker 的情况下构建镜像 在我的项目的 Maven 构建中 我想生成 docker 映像 但我不想强迫其他人在他们的机器上安装 docker 我可以想到一些安装了 docker 的虚拟框映像 但这是一种繁重的解决方案
  • Maven:命令行下载pom.xml中描述的依赖项

    我想知道maven命令行下载pom xml中描述的依赖项 是这样的 mvn dependency copy dependencies Try the 依赖 离线 http maven apache org plugins maven dep
  • 从 CLI 部署 Maven 项目?

    在 IDE 中构建并运行良好 cd home thufir NetBeansProjects HelloMaven JAVA HOME usr lib jvm java 8 openjdk amd64 home thufir local s
  • 使用 jar 依赖项构建 Android 库项目

    我已经被一个问题困扰了几天 但我不知道如何解决这个问题 我正在处理一个 Android 库项目 该项目正在使用 android sdk 提供的 Android 工具进行编译 在项目内部 我遵循 Android 项目的标准结构 我的 jar
  • 应用程序启动时突然出现 Firebase java.lang.IllegalAccessError

    突然发生崩溃安装后应用程序的初始启动 但只是第一次 第二次打开应用程序后它可以正常工作 我没有更改 firebase 代码 但可能是依赖项 但是到最新版本 所以通常它应该是一个稳定的版本 似乎有一些与 firebase 相关的问题 java
  • 如何在 MultiJob 插件中传递内部版本号?

    The 多作业插件 https wiki jenkins ci org display JENKINS Multijob Plugin很棒 我想将它用于我的构建过程 但之前有一个问题必须解决 有三个作业 A B 和 C SVN 触发作业 A
  • maven 无法下载 jacoco 0.7.10-SNAPSHOT jar

    我对此感到困惑 我的 pom xml 中有这个
  • 团队构建 - 获取工作空间 - 从特定路径获取最新信息,而不是所有内容

    我有一个简单的构建定义 我想用它来构建一个项目 每次我选择运行此构建时 我都想从仅与相关项目相关的分支 目录中获取最新信息 我怎么做 对 获取工作空间 的调用得到一切来自源代码控制 并且出于各种原因 我不想 或需要 从所有内容中获取最新信息
  • Golang - 更改 Windows 上的构建工作路径

    我正在使用 SublimeText3 GoSublime 插件 在 Windows 8 上测试简单的 Go 程序 go run v example go 在运行之前它正在内部编译 应用程序数据 本地 温度 目录 我的防病毒程序认为这是病毒并
  • Github 操作测试之前是否进行了包含特定单词的提交

    我需要确保使用 github 操作进行测试 如果之前已进行包含该单词的提交build 如果提交不包含单词build那么不应运行 github 操作的测试 你能给我一些建议吗 Test name Testing on push branche
  • 如何创建一个省略其内容时间戳的 tar 文件?

    有没有办法创建一个 tar省略其文件 目录的 atime ctime mtime 值的文件 我们为什么要这样做 我们的构建过程中有一个步骤 生成一个打包到 tar 文件中的工件目录 我们期望构建步骤是幂等的 给定相同的输入 它会产生exac

随机推荐

  • Windows Azure VM (Mac) 为 ios 设备构建 Ionic 应用程序

    我正在使用 Ionic 框架开发 Ionic2 Angular 应用程序 我对 Android 没有任何问题 我的问题是 我可以使用 Windows Azure VM Mac 为 ios 设备构建应用程序吗 I have Win 8 1 O
  • 避免 Xamarin 相机的“确定重试”按钮

    我正在使用来自的相机代码库https github com rasmuschristensen XamarinFormsImageGallery https github com rasmuschristensen XamarinForms
  • 用两个向量排序

    我想知道是否有可能 例如 vector
  • 计算 Pubsub 主题中未确认消息的数量

    我想在来自 pubsub 主题的所有消息都得到确认后执行一项操作 我尝试使用 Stackdriver 监控 API 来衡量 按云区域细分的未确认消息数 但不了解区域过滤器以及为什么需要它 在哪里可以查看我的主题使用的区域 并且由于某种未知的
  • 如何使用 JQL 检索特定状态的问题

    输入 url 或使用curl 运行 例如 https
  • list.count() 与 Counter() 性能

    在尝试查找字符串中一堆字符的频率时 为什么对 4 个不同的字符运行 string count character 4 次会比使用 collections Counter string 产生更快的执行时间 使用 time time 背景 给定
  • 如何在iOS 4中启用后台iPod控件来控制非iPod音乐?

    我想要完成的一个很好的例子是在最新版本的SpotifyiPhone应用程序 Pandora似乎有相同的功能 当 Spotify 在后台时 双击会打开 多任务坞 其中 iPod 控件 播放 暂停 前进等 允许控制 Spotify 的音乐播放
  • 升级到 Grails 2.3.0 时 RESTful 请求缺少参数

    我正在使用 Grails 和 RESTful 来开发我的 Web 应用程序 一切正常 直到我将应用程序升级到 Grails 2 3 这是我的 UrlMappings 我仍然正常发送请求 提交或做一些其他事情 但在 POST PUT 请求中
  • Bash:使用管道运算符时 Trap ERR 不起作用

    我试图将 stdout 和 stderr 中的所有内容记录到日志文件中 并仍然保留控制台 为此 我只是附加 tee a log file log对每一个命令 但是 如果脚本期间发生任何错误 我还想运行自定义命令 为此 我在脚本的开头添加了以
  • 警告:/etc/php/7.0/mods-available 下不存在模块 ini 文件

    我已经从 ubuntu 卸载了 php7 及其所有模块 当我尝试重新安装模块时 每个 php 模块都会出现以下错误 尽管模块已安装 但由于此错误 它未激活并且无法使用他们 有什么办法可以解决这个问题吗 每个模块的错误 安装时 Not rep
  • 来自数据库的实体生成器

    我需要在春天从现有数据库生成基于注释的实体 我尝试过骄傲 但生成的实体没有注释 我如何在基于骄傲的实体中生成注释 或者任何人都可以建议我一个好的实体生成器 我想说我也尝试过spring roo 您可以尝试 Telosys Tools 这是一
  • C++ 有什么方法可以以编程方式检测 POD 结构吗?

    我有存储 POD 结构的数据结构 每个实例化仅存储单个类型 因为它基本上是特定 POD 结构的数组 有时另一个开发人员 将修改这些结构之一 添加或修改数据类型 如果添加非 POD 元素 例如std string 数据结构在运行时崩溃 因为内
  • 如何禁用颤动开关

    在我的帮助屏幕中 我有这个开关 其目的是不执行任何操作 只是按原样显示 但我现在遇到的问题是 即使它没有做任何事情 用户也可以拖动开关 所以我试图弄清楚如何禁用它 以便没有人可以拖动开关按钮 return Container child C
  • C# 中的激活函数列表

    我可以在数学中找到激活函数列表 但在代码中却找不到 所以我想如果应该有这样一个列表的话 这将是代码中放置这样一个列表的正确位置 从这两个链接中算法的翻译开始 https en wikipedia org wiki Activation fu
  • 将进度条改为双倍

    进度条 ProgressBar pb ProgressBar findViewById R id progressbar pb setProgress 0 int k int max pb setMax k int j int cost p
  • 使用reinterpret_cast访问类似“struct {double, int}”的对象

    通过访问对象reinterpret casted 指针和相关的 UB 已经在这里进行了广泛的讨论 阅读问题和答案后 我仍然不确定是否正确使用 POD 类型的未初始化内存 假设我想 模仿 struct double d int i 通过手动为
  • Meteor 1.0 - 为什么“构建应用程序”花费的时间比以前长得多?

    所以我刚刚更新到Meteor 1 0 在本地开发应用程序时 每当我更新任何 js 文件时 构建应用程序都需要大约 15 秒以上的时间 在此期间控制台会显示 正在构建应用程序 尔格 这是 1 0 中的新行为吗 过去需要 1 2 秒才能看到对
  • 无法使用 Maven“mvn package”构建 Guava

    我刚刚阅读了 Guava 并查看了它的源代码 但不知道如何构建它来使用 我使用 mvn package 构建了 jar 文件 但它生成了 Guava GWT 错误 ERROR Failed to execute goal on projec
  • 为什么我在运行简单的 Spring Boot 应用程序时总是收到状态为“404”的 Whitelabel 错误页面

    我的控制器 Controller RequestMapping ComponentScan com spring EnableAutoConfiguration public class HomeController Value frame
  • 为什么 Gradle 不在编译/运行时类路径中包含传递依赖项?

    我正在学习 Gradle 的工作原理 但我无法理解它如何解决项目传递依赖关系 现在 我有两个项目 projectA 它对外部库有一些依赖项 项目 仅对项目有一个依赖项 无论我如何尝试 当我构建projectB时 gradle都不在proje