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

时间:2015-12-15 10:14:15

标签: java gradle dependencies

在我的项目中添加依赖项时,我无法确定应该给它们的前缀,例如: "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'
} 

3 个答案:

答案 0 :(得分:29)

我猜你在compile块中引用了classpathdependencies {}。如果是这样,那些就是依赖Configurations

  

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

compile配置由Java插件创建。 classpath块中常见buildSrc {}配置,其中需要为build.gradle声明依赖关系,本身(对于插件,可能)。

答案 1 :(得分:29)

如果 buildscript 本身需要运行某些内容,请使用 classpath

如果您的项目需要运行某些内容,请使用编译

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

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

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

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

答案 2 :(得分:7)

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

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

我认为你应该已经熟悉了Project.dependencies脚本块。在这个块中,我们声明了源代码所需的依赖项。有几种方法可以声明项目所需的依赖项。见Gradle Tutorial: Dependency Types。我只提到与此问题最相关的部分:

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

Gradle Tutorial: Organizing Build Logic中说:

  

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

     

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

     

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

我希望你现在已经清楚了。

使用classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}",我们将classpath方法设置为com.android.tools.build:gradle:${Versions.android_gradle_plugin},这是一个模块依赖项,由构建脚本本身而不是项目中的源使用。

另一方面,对于compile 'org.hibernate:hibernate-core:5.0.5.Final',我们使用编译configuration声明项目所需的模块依赖关系。

tl; dr:classpathcompileimplementation都是可以在不同情况下用于抵御依赖关系的关键字。如果要将依赖项传递给构建脚本,则使用前者,后者是您可能要声明的configuration之一。