在Maven中,当您可以<dependencyManagement>
在父POM 的部分中定义依赖项并从子模块引用该依赖项而无需指定版本或范围或任何其他内容时,它具有非常有用的功能。
Gradle有哪些替代方案?
在Maven中,当您可以<dependencyManagement>
在父POM 的部分中定义依赖项并从子模块引用该依赖项而无需指定版本或范围或任何其他内容时,它具有非常有用的功能。
Gradle有哪些替代方案?
Answers:
您可以在父脚本中声明常见的依赖项:
ext.libraries = [ // Groovy map literal
spring_core: "org.springframework:spring-core:3.1",
junit: "junit:junit:4.10"
]
然后,可以从子脚本中使用依赖项声明,如下所示:
dependencies {
compile libraries.spring_core
testCompile libraries.junit
}
要与高级配置选项共享依赖项声明,可以使用DependencyHandler.create
:
libraries = [
spring_core: dependencies.create("org.springframework:spring-core:3.1") {
exclude module: "commons-logging"
force = true
}
]
可以使用相同的名称共享多个依赖项:
libraries = [
spring: [ // Groovy list literal
"org.springframework:spring-core:3.1",
"org.springframework:spring-jdbc:3.1"
]
]
dependencies { compile libraries.spring }
然后将立即添加两个依赖项。
您不能以这种方式共享的一条信息是应将依赖项分配给哪种配置(以Maven术语表示的范围)。但是,以我的经验来看,最好还是对此进行明确说明。
dependencies.gradle
脚本,在其中我将所有依赖项定义为属性,例如:ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'
。在根项目中build.gradle
,我包括allprojects { apply from: "$rootDir/dependencies.gradle" }
。然后,所有依赖项都在一个文件中定义,而不是在周围散布,并且在依赖项配置中使用更多“易于读取”的常量。
allprojects
因为项目级的额外属性对子项目可见。
回复很晚,但是您可能还想看看:http : //plugins.gradle.org/plugin/io.spring.dependency-management 它提供了导入maven'bom'并重用定义的可能性在“宝”中定义。从Maven逐渐迁移到gradle时,这无疑是一个很好的帮助!现在享受它。
从Gradle 4.6开始,文档中建议使用依赖项约束来实现此目的。来自https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version:
对于较大的项目,建议的做法是声明没有版本的依赖项,并将依赖项约束用于版本声明。优点是,依赖关系约束使您可以在一处管理所有依赖关系的版本,包括传递性。
在您的父build.gradle
文件中:
allprojects {
plugins.withType(JavaPlugin).whenPluginAdded {
dependencies {
constraints {
implementation("com.google.guava:guava:27.0.1-jre")
}
}
}
}
whenPluginAdded {
不必严格检查Java插件(... )来包装依赖关系块,但是它将处理将非Java项目添加到同一内部版本。
然后,在儿童gradle项目中,您可以简单地省略版本:
apply plugin: "java"
dependencies {
implementation("com.google.guava:guava")
}
子版本仍可以选择指定更高版本。如果指定了较低的版本,它将自动升级到约束中的版本。
allprojects
也很好。
io.spring.gradle:dependency-management-plugin
插件在新的Gradle 3.x系列中存在问题,但对于2.x系列稳定。供参考,请参考错误报告 Drop对Gradle 3#115的支持。
如果是Spring(BOM使用的主要推动者),则可能以:
buildscript {
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'
}
}
repositories {
mavenLocal()
jcenter()
}
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
}
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
注意io.spring.platform:platform-bom
有org.springframework.boot:spring-boot-starter-parent
作为父项,因此它与Spring Boot兼容
您可以通过以下方式验证实际的依赖关系解决方案:
$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ
$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ
或与任务:
task showMeCache {
configurations.compile.each { println it }
}
阅读官方的Soring博客文章Gradle更好的依赖管理,以了解引入它的原因io.spring.gradle:dependency-management-plugin
。
您可以集中使用以下代码依赖项:
在 gradle.properties
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
TARGET_SDK_VERSION=26
MIN_SDK_VERSION=14
ANDROID_SUPPORT_VERSION=26.0.2
在每个模块中添加到build.gradle
:
android {
compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION as String
defaultConfig {
minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int
versionCode 1
versionName "1.0"
}
}
dependencies {
compile "com.android.support:appcompat-v7:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-v4:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-annotations:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-vector-drawable:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:design:${ANDROID_SUPPORT_VERSION}"
}
这篇博客文章建议将依赖项和组作为配置进行管理:https : //www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html
我自己没有尝试过,但是看起来很有趣。
根项目build.gradle
subprojects {
configurations {
commonsIo
}
dependencies {
commonsIo 'commons-io:commons-io:2.5'
}
}
子项目build.gradle
configurations {
compile.extendsFrom commonsIo
}
为了使gradle文件保持干净,我们可以将依赖项分组到一个数组中,并在以后实现它们。
//声明库的版本
final RetrofitVersion = '2.3.0' final OkHttpVersion = '3.9.1'
//在库中使用version并添加依赖项以及访问名(例如retrofit(第一个))
final networkDependencies = [ retrofit : "com.squareup.retrofit2:retrofit:${RetrofitVersion}", retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}", retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}", okHttp3 : "com.squareup.okhttp3:okhttp:${OkHttpVersion}", okHttp3Logging : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}" ]
//实现数组中的所有依赖项
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation networkDependencies.values() }
因此,最终代码将如下所示:
final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
final networkDependencies = [
retrofit : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
okHttp3 : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
okHttp3Logging : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation networkDependencies.values()
}