Gradle 中编译和运行时配置的区别

     2023-02-26     130

关键词:

【中文标题】Gradle 中编译和运行时配置的区别【英文标题】:Difference between compile and runtime configurations in Gradle 【发布时间】:2013-05-18 01:06:37 【问题描述】:

我的问题有点常见,但也与 Gradle 相关。

为什么我们需要编译和运行时配置?

当我编译某些东西时,我需要工件来将我的 java 类转换为字节码,所以我需要编译配置,但是为什么需要运行时配置我还需要其他东西来在 JVM 中运行我的应用程序?

对不起,如果这听起来很愚蠢,但我不明白。

【问题讨论】:

【参考方案1】:

在最常见的情况下,编译时所需的工件是运行时所需工件的子集。例如,假设一个名为app 的程序使用库foo,而库foo 在内部 使用库bar。那么编译app只需要foo,但是运行它需要foobar。这就是为什么默认情况下,您在 Gradle 的 compile 配置中放置的所有内容在其 runtime 配置中也可见,但反之则不然。

【讨论】:

很遗憾gradle.org/docs/current/userguide/dependency_management.html 中没有明确提及这一点。他们使用编译和运行时没有明确说明它们的含义...... @silasdavis 在文档中解释了区别:gradle.org/docs/current/userguide/… 在 8.3 中。依赖配置 @angelcervera 嗯,确实如此,8. 依赖管理基础知识和 51. 依赖管理。我可以理解为什么它们有两个部分,但是如果后者引用前者可能会很好。我想我登陆 51 并期望它能够提供完整的说明。 @silasdavis 是的。文档中的其他部分也是如此。我必须花同样的空闲时间阅读从 A 到 Z 的所有文档。 @Peter Niederwieser 如果编译任务显示与运行时相同的依赖关系,在什么情况下您会使用运行时而不是编译?【参考方案2】:

根据最新的 gradle 版本更新答案。

来自以下链接的 gradle 官方文档:

https://docs.gradle.org/current/userguide/upgrading_version_5.html

弃用

不应再使用编译和运行时配置声明依赖关系编译和运行时的使用 不鼓励 Java 生态系统插件中的配置 从 Gradle 3.4 开始。

需要使用 implementation、api、compileOnly 和 runtimeOnly 配置来声明依赖和 compileClasspath 和 runtimeClasspath 配置来解决依赖关系。

更重要的是,在最近发布的 Gradle 7.0 版本中,已经删除了编译依赖配置。

如果您尝试在 Gradle 3.4+ 项目中使用 compile,您将收到如下警告:

此版本中使用了已弃用的 Gradle 功能,使其 与 Gradle 7.0 不兼容。使用‘–warning-mode all’来显示 个别弃用警告。

您应该始终使用实现而不是编译依赖项,并使用 runtimeOnly 而不是运行时。

什么是实现依赖?

当您构建和运行 Java 项目时,涉及到两个类路径:

编译类路径 – JDK 能够将 Java 代码编译为 .class 文件所需的那些依赖项。

运行时类路径 – 实际运行已编译的 Java 代码所需的那些依赖项。

当我们配置 Gradle 依赖项时,我们真正要做的就是配置哪些依赖项应该出现在哪个类路径上。鉴于只有两个类路径,因此我们可以使用三个选项来声明我们的依赖项。

    compileOnly - 仅将依赖项放在编译类路径上。 runtimeOnly - 仅将依赖项放在运行时类路径上。 实现 - 将依赖项放在两个类路径上。

如果您需要依赖项同时位于编译和运行时类路径上,请使用实现依赖项配置。如果不, 考虑 compileOnly 或 runtimeOnly。

【讨论】:

如果我只想要定义,这是一个很好的答案。 :D

gradle几种依赖方式的区别(代码片段)

一、implementation:依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。什么意思呢?假设A依赖B,B以implementation方式依赖C,那么C在编译和运行时都对B模块可用,即编译和运行时模块B都可以调用... 查看详情

vs系列软件中debug和release编译环境有什么区别

当编译和执行一个工程时,可以在Debug和Release两种配置下执行。Debug模式用于调试程序,这是个受保护的运行环境,它将告诉你程序是否有泄露,在运行时也能对特定函数的结果进行检查。然而它生成的可执行文件运行较慢。因... 查看详情

gradle和maven有啥用?分别有啥区别

Gradle和Maven都是项目自动构建工具,编译源代码只是整个过程的一个方面,更重要的是,你要把你的软件发布到生产环境中来产生商业价值,所以,你要运行测试,构建分布、分析代码质量、甚至为不同目标环境提供不同版本,... 查看详情

如何在 Vue 和 Snowpack 中配置运行时编译

】如何在Vue和Snowpack中配置运行时编译【英文标题】:HowtoconfigureruntimecompilationinVueandSnowpack【发布时间】:2021-02-2411:40:02【问题描述】:我正在尝试通过运行时编译来设置Vue项目,但我不太确定如何在Snowpack中进行配置。目前,... 查看详情

如何在 Gradle 中定义编译时 *only* 类路径?

】如何在Gradle中定义编译时*only*类路径?【英文标题】:HowdoIdefineacompile-time*only*classpathinGradle?【发布时间】:2012-05-1111:14:15【问题描述】:谁能给我一个简单的build.gradle示例,说明如何指定不包含在运行时部署(war)中的仅编译时... 查看详情

如何在 Gradle 中定义编译时 *only* 类路径?

】如何在Gradle中定义编译时*only*类路径?【英文标题】:HowdoIdefineacompile-time*only*classpathinGradle?【发布时间】:2012-05-1111:14:15【问题描述】:谁能给我一个简单的build.gradle示例,说明如何指定不包含在运行时部署(war)中的仅编译时... 查看详情

如何在 Gradle 中定义编译时 *only* 类路径?

】如何在Gradle中定义编译时*only*类路径?【英文标题】:HowdoIdefineacompile-time*only*classpathinGradle?【发布时间】:2012-05-1111:14:15【问题描述】:谁能给我一个简单的build.gradle示例,说明如何指定不包含在运行时部署(war)中的仅编译时... 查看详情

java编译时注解和运行时注解有啥区别

区别如下:1)编译时注解,注解内容只存在源文件,在编译期间将被丢弃,不能通过JVM获取注解信息;2)运行时注解,编译时被存储在.class字节码文件,可以通过JVM运行时获取注解信息(且只限于被RUNTIME注解的注解)。参考技术A重... 查看详情

选择要运行的配置类型时,在 IntelliJ IDEA 15 中运行 Gradle 测试而不是 Junit 测试

】选择要运行的配置类型时,在IntelliJIDEA15中运行Gradle测试而不是Junit测试【英文标题】:RunGradletestandnotJunittestinIntelliJIDEA15whenchoosingconfigurationtypetorunwith【发布时间】:2016-03-2319:16:06【问题描述】:我从14更新到Intellij15.02,并想... 查看详情

androidproject和app中两个build.gradle配置的区别

...Lambda和ButterKnife的使用,我发现他们的导入在Project的build.gradle 查看详情

gradle中api、implementation和compile的区别

参考技术A我们在gradle中引用第三方maven库时,一般通过下面的语句去引用:然后syncproject,就能成功引用对应的包到项目之中了,十分方便。除了使用compile关键字,使用implementation和api也能将包引用到项目中:看起来这三个关键字... 查看详情

gradlew和gradle的区别

...Spring的时候(https://spring.io/guides/gs/rest-service/)看到的“gradlew”(./gradlewbootRun),真的不知道这是个什么鬼。命令行运行报“非内部命令”错误;在gradle安装目录中搜索没有找到;百度也没有;官网搜索也没有。最后直接运行... 查看详情

windows中lib和dll的区别与使用

...但是需要.exe和dll同时发布)2、LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库staticlinklibrary。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll文... 查看详情

gradlests与gradle有何区别

估计网友的困惑指出在于eclipse上安装了gradle插件却发现没有gradleproject却有个gradle(STS)project吧,这是因为安装的gradle插件不同的原因,gradle的插件有2种,分别为buildship和sts,安装buildship的话eclipse中显示gradleproject如果安装的是... 查看详情

如何在多模块项目(编织所有模块)中使用 Spring BOOT 和 Gradle 实现 AspectJ 编译时编织?

】如何在多模块项目(编织所有模块)中使用SpringBOOT和Gradle实现AspectJ编译时编织?【英文标题】:HowtoachieveAspectJcompiletimeweavingusingSpringBOOTandGradleinanmultimoduleproject(weavingallmodules)?【发布时间】:2019-11-2422:19:13【问题描述】:我想... 查看详情

gradle命令行运行lint时在apk项目中的build.gradle配置选项

...分析的进度quiettrue//如果为true,则当lint发现错误时停止gradle构建abortOnErrorfalse//如果为true,则只报告错误ignoreWarningstrue//如果为true,则当有错误时会显示文件的全路径或绝对路径(默认情况下为true)//absolutePathstrue//如果为 查看详情

编译和解释的区别

编译器:一次性的把源程序的每一条语句都编译成机器语言,并保存成二进制文件.这样运算时计算机可以直接以机器语言来运行此程序,速度很快解释器:则是在执行源程序的时候一条一条的解释成机器语言给计算机来执行,所以运行... 查看详情

gradle依赖&解决依赖冲突

...dependencies是什么呢?下面来看看相关的源码:我们在build.gradle引入两个依赖库:执行一下命令查看依赖报告:Gradle执行结果:下面我们配置,当Gradle构建遇到依赖冲突时,就立即构建失败:在点击build时,会出现如下错误:方式1... 查看详情