我的问题有点普遍,但它也与Gradle有关。
为什么我们需要编译和运行时配置?
当我编译一些东西时,我需要构件来将我的Java类转换为字节码,因此我需要编译配置,但是为什么需要运行时配置?难道我需要其他东西来在JVM中运行我的应用程序吗?
如果听起来很愚蠢,对不起,但我不明白。
我的问题有点普遍,但它也与Gradle有关。
为什么我们需要编译和运行时配置?
当我编译一些东西时,我需要构件来将我的Java类转换为字节码,因此我需要编译配置,但是为什么需要运行时配置?难道我需要其他东西来在JVM中运行我的应用程序吗?
如果听起来很愚蠢,对不起,但我不明白。
在大多数情况下,编译时所需的构建工具是运行时所需工具的子集。例如,假设程序名为app
的程序使用库foo
,而库foo
内部使用库bar
。那么仅需要foo
来编译app
,但运行它需要foo
和bar
两者。这就是为什么默认情况下,您将放置在Gradle的compile
配置中的所有内容也会出现在其runtime
配置中,但反之则不成立。
根据最新的gradle版本更新答案。
以下链接是从gradle官方文档中获取的:
https://docs.gradle.org/current/userguide/upgrading_version_5.html
弃用功能
不应再使用compile和runtime配置来声明依赖项。自Gradle 3.4以来,Java生态系统插件已经不推荐使用compile和runtime配置。
应该使用implementation、api、compileOnly和runtimeOnly配置来声明依赖项,并使用compileClasspath和runtimeClasspath配置来解析依赖项。
此外,在最近发布的Gradle 7.0版本中,已删除了compile依赖项配置。
如果在Gradle 3.4+项目中尝试使用compile,则会收到如下警告:
本构建使用了已废弃的Gradle功能,与Gradle 7.0不兼容。请使用“--warning-mode all”显示单个过时警告。
您应该始终使用implementation而不是compile来声明依赖关系,并使用runtimeOnly而不是runtime。
什么是实现依赖项?
当构建和运行Java项目时,涉及两个类路径:
编译类路径 - 那些需要用于JDK将Java代码编译为.class文件的依赖。
运行时类路径 - 那些需要实际运行已编译Java代码的依赖。
当我们配置Gradle依赖项时,我们所做的就是配置哪些依赖项应出现在哪个类路径上。鉴于只有两个类路径,因此有三个选项来声明我们的依赖关系。
如果您需要将依赖项放置在编译和运行时类路径上,请使用实现依赖配置。否则,请考虑仅编译或仅运行时。
compile
和runtime
是java
插件的依赖配置。您可以在此处阅读更多信息:https://docs.gradle.org/current/userguide/userguide_single.html#tab:configurations - mixel