Gradle:classpath和编译依赖项有什么区别?

jav*_*999 65 java dependencies gradle

在向项目添加依赖项时,我无法确定应该给它们的前缀,例如"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'
} 
Run Code Online (Sandbox Code Playgroud)

小智 35

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

如果您的项目需要运行某些东西,请使用compile.

buildscript{}块用于build.gradle本身.

对于多项目构建,顶级构建文件用于根项目,特定构建文件用于子项目(模块).

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

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

  • 但是,如果项目只有一个模块(就像典型的 Android 应用程序一样),为什么不将应用程序依赖项放在顶层文件本身中呢? (2认同)

Eri*_*lin 34

我猜你正在引用compile并且classpathdependencies {}块内.如果是这样,那些是依赖配置.

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

compile配置是由Java插件创建.该classpath配置通常见于buildSrc {},其中一个需要声明依赖块为的build.gradle,本身(为插件,也许).

  • `dependencies {}` 块可以在 `buildscript {}` 内部和外部声明。在内部时,您使用`classpath` 配置来编译构建脚本本身所需的依赖项。 (2认同)

Ten*_* Yu 10

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

我会试着用我发现的东西回答这个问题.

我想你应该已经熟悉了Project.dependencies脚本块.在这个块中,我们声明了源代码所需的依赖项.有几种方法可以声明项目所需的依赖项.请参阅Gradle教程:依赖类型.我只会提到与此问题最相关的部分:

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

Gradle教程:组织构建逻辑中,它说:

如果构建脚本需要使用外部库,则可以将它们添加到构建脚本本身的脚本类路径中.您可以使用buildscript()方法执行此操作,并传入一个声明构建脚本类路径的闭包.

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

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

我希望现在事情变得清晰了.随着classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"我们设定classpath的配置与com.android.tools.build:gradle:${Versions.android_gradle_plugin}它是用来通过构建脚本本身,而不是在你的项目中的源模块的依赖性.

  • 好答案。我必须补充一点,我们不仅必须像上面解释的那样关注关键字本身,而且我们还必须考虑所请求的工件,因为关键字本身并不能定义完整的上下文。例如,“org.projectlombok:lombok:1.18.4”没有“classpath”关联,因为它是一个仅在编译“javac”时需要但在“java”运行时不需要的 jar。因此,正确的使用是定义的关键字和工件的相互作用。这意味着,一个人需要先验知识。 (2认同)