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


92

当添加依赖关系到我的项目,我从来不知道什么我前缀的应该给他们,例如"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'
} 

1
我不确定我是否理解。classpath不是有效的依赖项范围。
Tunaki 2015年

也许让我感到困惑,有效的依赖范围是什么?
java123999


我注意到的一件事是,compileOnly依赖关系去了project.configurations.compileClasspath而不是去依赖项project.configurations.compile,如此处所述github.com/iboyko/gradle-plugins/issues/5
Vytenis Bivainis

Answers:


47

我要去猜测,如果引用compile,并classpath在内部dependencies {}块。如果是这样,那么这些就是依赖项Configurations

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

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


谢谢,所以对于我的主要build.gradle我不需要使用classpath吗?
java123999

@ java123999不,除非您使用自定义编写的插件
Eric Wendelin

@EricWendelin在哪里说“在dependencies {}块内”是指“在buildscript {依赖{}}块内”?(我不确定,只是问问。)
Paulo Merson

2
一个dependencies {}块可以声明内外buildscript {}的它和外面。在内部时,可将classpath配置用于编译构建脚本本身所需的依赖项。
埃里克·温德林

55

如果buildscript本身需要运行,请使用classpath

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

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

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

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

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


确认:这是否意味着 proandroiddev.com/… 应该使用acompile而不是a classpath
WillC

1
但是,如果项目只有一个模块(如典型的android应用程序),为什么不将应用程序依赖项放在顶级文件本身中呢?
Harsha

18

如果我理解正确,那么您会将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}构建脚本本身而不是项目源代码将使用模块依赖关系。

另一方面,compile 'org.hibernate:hibernate-core:5.0.5.Final'我们通过compile configuration声明了您的项目所需的模块依赖关系。

TL;博士:本classpathcompile以及implementation是可以针对不同的情况下依赖使用的所有关键字。当您要向构建脚本传递依赖项时,使用前者,而后者是您可能要声明的配置之一。


1
好答案。我必须补充,不仅我们必须像上面很好解释的那样盯着关键字本身,而且我们还必须考虑到所请求的工件,因为仅关键字并不能定义完整的上下文。例如,'org.projectlombok:lombok:1.18.4'没有classpath关联,因为它是一个jar,仅在编译javac时需要,而java运行时则不需要。因此,正确的用法是所定义的关键字和工件的相互作用。这意味着,需要先验知识。
eigenfield '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.