Java Gradle:类路径依赖项和编译依赖项之间有什么区别?

Java Gradle:类路径依赖项和编译依赖项之间有什么区别?,java,gradle,dependencies,Java,Gradle,Dependencies,在向我的项目添加依赖项时,我从不确定应该给它们什么前缀,例如“classpath”或“compile”。 例如,我下面的依赖项应该是编译时还是类路径 另外,这应该在我的应用程序build.gradle中还是在特定于模块的build.gradle中 当前build.gradle(在应用程序级别): apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'org.hibernate:

在向我的项目添加依赖项时,我从不确定应该给它们什么前缀,例如
“classpath”
“compile”。

例如,我下面的依赖项应该是编译时还是类路径

另外,这应该在我的应用程序build.gradle中还是在特定于模块的build.gradle中

当前build.gradle(在应用程序级别):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

我猜您在
dependencies{}
块中引用了
compile
classpath
。如果是这样,那就是依赖关系

配置只是一组命名的依赖项

compile
配置由Java插件创建。
classpath
配置通常出现在
buildSrc{}
块中,其中需要声明build.gradle本身(可能是插件)的依赖项。

如果buildscript本身需要运行一些东西,请使用classpath

如果项目需要运行,请使用编译

buildscript{}
块用于build.gradle本身

对于多项目生成,顶级生成文件用于根项目,特定生成文件用于子项目(模块)

顶级生成文件,您可以在其中添加所有子项目/模块通用的配置选项


不要将应用程序依赖项放在顶级生成文件中,它们属于单个模块build.gradle文件

如果我理解正确,您将
Project.dependencies
脚本块与
Project.buildscript.dependencies
脚本块混淆(就像我遇到这个问题时所做的那样)

我会用我的发现来回答这个问题

我认为您应该已经熟悉了
Project.dependentials
脚本块。在此块中,我们声明源代码所需的依赖项。有几种方法可以声明项目所需的依赖项。看见我只想提及与此问题最相关的部分:

编译'org.hibernate:hibernate core:5.0.5.Final'
是一个模块依赖项声明。编译配置(现在被实现配置弃用)只是
仅实现依赖项的一个关键字。
它不是一个描述依赖项类型的关键字(这里按类型我遵循教程中定义的三种类型,即模块、文件和项目)

信中说:

如果构建脚本需要使用外部库,则可以添加它们 到构建脚本本身中脚本的类路径。你这么做 使用buildscript()方法,传入一个闭包,该闭包声明 构建脚本类路径

例如,这与您声明Java编译的方式相同 类路径。您可以使用中描述的任何依赖项类型 依赖项类型,项目依赖项除外

声明了构建脚本类路径后,您可以使用中的类 与类路径上的任何其他类一样构建脚本

我希望你现在明白了

使用
classpath“com.android.tools.build:gradle:${Versions.android\u gradle\u plugin}”
我们正在使用
com.android.tools.build:gradle:${Versions.android\u gradle\u plugin}
设置方法,这是构建脚本本身使用的模块依赖项,而不是项目中的源代码

另一方面,通过
compile'org.hibernate:hibernate core:5.0.5.Final'


tl;dr:
类路径
编译
、和
实现
都是在不同情况下可以用来处理依赖关系的关键字。前者用于将依赖项传递给构建脚本,后者是您可能需要声明的依赖项之一。

我不确定是否理解<代码>类路径不是有效的依赖范围。也许我有点困惑了,什么是有效的依赖范围?看看这篇文档:我注意到,
compileOnly
依赖关系转到
project.configurations.compileClasspath
而不是
project.configurations.compile
,正如这里提到的,谢谢,所以对于我的main build.gradle,我不需要使用classpath?@java123999否,除非您使用自定义编写的plugins@EricWendelin你说的“在依赖项{}块内”是指“在构建脚本{依赖项{}块内”吗?(我不确定,只是问一下。)可以在
buildscript{}
内部和外部声明
dependencies{}
块。在内部,您使用
类路径
配置来获取编译构建脚本本身所需的依赖项。要确认:这是否意味着应该使用
编译
而不是
类路径
?但是,如果项目只有一个模块,为什么不将应用程序依赖项放在顶级文件本身中呢,喜欢典型的android应用程序吗?回答得好。我必须补充一点,我们不仅必须像上面很好地解释的那样盯着关键词本身,而且我们还必须考虑所请求的工件,因为仅仅关键词并不能定义完整的上下文。例如,
'org.projectlombok:lombok:1.18.4'
没有
classpath
关联,因为它是一个jar,只在编译
javac
时需要,而在
java
运行时不需要。因此,正确的使用是定义的关键字和工件的相互作用。这意味着,一个人需要先验知识。