我目前正在尝试将Maven
项目迁移到Gradle
在我的Maven
版本中,我在父 pom:
<properties>
<spring.version>4.2.3.RELEASE</spring.version>
<spring.boot.version>1.3.3.RELEASE</spring.boot.version>
...
</properties>
然后我可以在任何子模块中定义这样的依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
我试图在Gradle
上做同样的事情,因为我的一些模块像这样共享依赖版本,如果我想升级Spring或做类似的操作,我不想修改多个地方。
我最接近它的是:
dependencies {
ext.springVersion = '4.2.3.RELEASE'
compile "org.springframework:spring-jdbc:$springVersion"
}
但这仍然不起作用。在Gradle中实现这一点的推荐方法是什么?或者Gradle有不同的处理方式吗?也许我对Maven的关注仍然太多,看不到其他解决方案。
请记住,在Gradle上的尝试并不是我想要的。我希望能够在单独的文件中定义依赖关系,而不是直接在将使用它的文件上。
以下build.gradle
文件的配置对我的gradle version 4.5
有效,在这里发布以供将来参考-
ext {
springVersion = '5.0.3.RELEASE'
}
dependencies {
compile "org.springframework:spring-context:$springVersion"
}
使用双引号它对我有效
buildscript {
ext {
springBootVersion = '2.0.4.RELEASE'
hazelCastVersion = '3.10.4'
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
dependencies {
compile('org.springframework.cloud:spring-cloud-starter-config')
compile "com.hazelcast:hazelcast-spring:${hazelCastVersion}"
compile group: 'com.hazelcast', name: 'hazelcast', version: "${hazelCastVersion}" }
您提供依赖版本的方式是正确的,应该可以工作。IntelliJ Idea在gradle构建脚本中有一些变量问题,所以你不必依赖它,只是试着运行你的构建并检查,是否下载了依赖项并且你的项目是正确构建的。
如果您希望将项目依赖项存储在单独的文件中,那么最常见的方法是在根构建中定义它们。脚本,通过subprojects
关闭所有子项目,或通过allprojects
,如果你想指定所有项目的依赖关系,包括根。它看起来像这样:
subprojects{
dependencies{
compile ...
}
}
通过这种方式,您可以为根构建脚本中的子项目提供任何公共配置。阅读用户指南
或者你可以在根构建脚本中声明一个变量,将它初始化为一个包含你需要的所有依赖规范的映射,或者作为一个包含单个依赖列表的数组,并在你的子项目中使用这个变量,如果你需要的话。像这样在根目录:
ext.commomLibs = [
'testlibs' : 'junit:junit:4.8'
]
注意,您可以将map的值定义为lib规范的数组,以使其指向所有这些依赖项。然后你可以在子项目中使用它:
dependencies{
testCompile commomLibs.testlibs
}
另一种选择是使用带有依赖关系的单独构建脚本,并将其应用于所需的构建脚本,如
apply from: 'dependencies.script'
然后你可以把你的依赖放到依赖脚本中,然后在任何你需要这个依赖和/或可能是一些公共逻辑的构建脚本中应用它。
你现在可以在App Gradle Build中使用更接近依赖项的,如下所示:
dependencies {
def daggerVersion = "2.24"
implementation "com.google.dagger:dagger:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}
加上Vikas Sachdeva的回答:
在我的子项目中,这种方式对我不起作用。Gradle抛出一个错误'Could not find org.springframework:spring-context:$springVersion'。最后,我通过添加加号解决了这个问题。
例如:
根gradle.properties:
springVersion = '5.0.3.RELEASE'
根build.gradle dependencies {
compile "org.springframework:spring-context:${springVersion}"
}
子项目build.gradle
dependencies {
compile "org.springframework:spring-context:" + springVersion
}
我的gradle版本是5.4.1
或者你可以使用插件管理你的依赖版本。
io.spring.dependency-management
参考:https://docs.spring.io/dependency-management-plugin/docs/current/reference/html/
在gradle v6.1.1
上,最简单的是:
dependencies {
def jerseyVersion = '2.29.1'
compile group: 'org.glassfish.jersey.core', name: 'jersey-client', version: jerseyVersion
// ...
}
本文描述的gradle中管理依赖项的现代方法:https://docs.gradle.org/current/userguide/platforms.html子:central-declaration-of-dependencies
我个人更喜欢。toml文件:https://docs.gradle.org/current/userguide/platforms.html#sub:conventional-dependencies-toml它是清晰的,类型安全的,并且IDEA过滤器与它配合得很好。
在Gradle中将依赖版本声明为变量的最佳实践
对于包含多个模块的Android项目,
在项目级别定义某些属性并在所有模块之间共享它们可能很有用。您可以通过向顶级build.gradle
文件中的ext
块添加额外的属性来实现这一点,如下所示。
在buildscript
块中添加你的版本变量
ext {
version_navigation = "2.5.1"
version_lifecycle = "2.5.1"
version_kotlin = "1.7.10"
}
对于单模块项目(仅限app模块),使用app的build.gradle
在根目录中,在ext块中添加版本变量
ext {
version_navigation = "2.5.1"
version_lifecycle = "2.5.1"
version_kotlin = "1.7.10"
}
我有一个替代的语法糖。我猜这是写依赖的"长"方式。
大师"gradle.build "
plugins {
id 'java'
}
ext {
slf4jApiVersion = '1.7.28'
junitVersion = '4.12'
}
gradle.build
dependencies {
testCompile group: 'junit', name: 'junit', version: "${junitVersion}"
compile group: 'org.slf4j', name: 'slf4j-api', version: "${slf4jApiVersion}"
}
注意group, name和version的分隔…组值和名称值周围用单引号,版本值变量周围用双引号。
另一种方法:在构建的同一目录中创建一个文件。gradle 应用。将这个新文件命名为:dependencies.gradle在你的建筑里。gradle app将这行添加到顶部
apply from: 'dependencies.gradle'
在依赖项中定义变量。Gradle如下:
ext {
versions = [
camerax_version : "1.1.0-alpha10",
camerax_extra_version : "1.0.0-alpha24",
constraintlayout : "2.0.3",
appcompat : "1.2.0"
]
camerax = [
camerax_core : "androidx.camera:camera-core:${versions.camerax_version}",
camerax_camera2 : "androidx.camera:camera-camera2:${versions.camerax_version}",
camerax_lifecycle : "androidx.camera:camera-lifecycle:${versions.camerax_version}",
camerax_extensions : "androidx.camera:camera-extensions:${versions.camerax_extra_version}",
camerax_view : "androidx.camera:camera-view:${versions.camerax_extra_version}"
]
androidx = [
constraints_layout : "androidx.constraintlayout:constraintlayout:${versions.constraintlayout}",
appcompat : 'androidx.appcompat:appcompat:${versions.appcompat}'
]}
最后在构建中使用这些变量。gradle module
implementation camerax.camerax_core
implementation camerax.camerax_camera2
implementation camerax.camerax_lifecycle
implementation camerax.camerax_extensions
implementation camerax.camerax_view