Gradle多模块实践:dependencies的模组化导入

虽然maven和gradle能够自动处理依赖,但是觉得还不够。

当java引入一个新组件时。如果全部引入,则会导致引入过多的jar;如果指定组件的各个模块,又需要逐条引入,尤其当需要其它模块支持时,当子模块多了后维护困难。

我希望像POM那样,指定一个文件则引入了需要的一组组件。而且不用单独书写一个pom,因为一来每个模块要单独文件管理,二来不方便统一管理。于是寻找gradle脚本grovvy的实现方式。通过数小时的折腾,终于解决该问题。

这样我们可以把多个组件引入的包定义为一个列表,需要时直接引入列表来实现引入对应的模块。

需要给gradle的rootProject的build.gradle添加一个grovvy function,如下:


/**
模组化添加依赖 addSupportLibraries(dependencies, dependency_spring_boot_group)
@param dependencies 上级的dependencies
@param supportLibrary 定义的库列表
@param compileOnly 默认导入方式是否为仅编译compileOnly,定义的库列表可以是字符串,也可以是对象,对象可以包含excludes和transitive属性,属性解释如下:excludes: 需要排除的列表,传入一个对象,对象包括group和module属性。等同与每项书写exclude group: 'xxx', module: 'xxx'transitive: 是否排除下面所有依赖,如果为false,则排除所有。等同于书写: transitive = falseExample1:implementation ("org.springframework.boot:spring-boot:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-starter:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}")书写为:rootProject.addSupportLibraries(dependencies, ["org.springframework.boot:spring-boot:${spring_boot_version}","org.springframework.boot:spring-boot-starter:${spring_boot_version}","org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}"])或者分开引入:rootProject.addSupportLibraries(dependencies, ["org.springframework.boot:spring-boot:${spring_boot_version}"])rootProject.addSupportLibraries(dependencies, ["org.springframework.boot:spring-boot-starter:${spring_boot_version}","org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}"])Example2:compileOnly ("org.springframework.security:spring-security-core:${spring_security_version}")compileOnly ("com.alicp.jetcache:jetcache-starter-redis-lettuce:${jetcache_version}"){exclude group: 'org.springframework.boot', module: 'spring-boot-starter'exclude group: 'org.springframework', module: 'spring-context'exclude group: 'org.slf4j', module: 'slf4j-api'}书写为:rootProject.addSupportLibraries(dependencies, ["org.springframework.security:spring-security-core:${spring_security_version}",[lib: "com.alicp.jetcache:jetcache-starter-redis-lettuce:${jetcache_version}",excludes:[[group: 'org.springframework.boot', module: 'spring-boot-starter'],[group: 'org.springframework', module: 'spring-context'],[group: 'org.slf4j', module: 'slf4j-api']]]],true)Example3:implementation ("org.xerial.snappy:snappy-java:1.1.8.4") // embedded ZOOKEEPER依赖,minio会提供compileOnly ("org.springframework.data:spring-data-elasticsearch:${spring_data_elasticsearch_version}"){transitive = false}书写为:rootProject.addSupportLibraries(dependencies, ["org.xerial.snappy:snappy-java:1.1.8.4",[lib: "org.springframework.data:spring-data-elasticsearch:${spring_data_elasticsearch_version}", transitive: false, compileOnly: true]])这样就可以把每个开源模块需要的库都定义为一个列表,按需引入*/
def addSupportLibraries(dependencies, supportLibrary, compileOnly = false){supportLibrary.each { library -> {if (library instanceof String || library instanceof org.codehaus.groovy.runtime.GStringImpl) {if (compileOnly) {dependencies.compileOnly library} else {dependencies.implementation library}} else { // 使用对象,定义每个属性var ifCompile = compileOnlyif(library?.compileOnly) {ifCompile = library.compileOnly //内部定义的优先级更高}var doResult;// 先执行操作if (ifCompile) {doResult = dependencies.compileOnly library.lib} else {doResult = dependencies.implementation library.lib}// 操作excludeif (library?.excludes) {library.excludes.each { excludeObj ->  {doResult.exclude(excludeObj)}}}// 操作 transitive = falseif (library?.transitive == false) {doResult.exclude(module: '*')}}}}
}

这样就可以对依赖项目的模块统一组件维护了。

我的gradle项目组织如下:

ccframe-simple
+--- ccframe-common
+--- ccframe-demo
+--- ccframe-service
+--- ccframe-web

在根项目ccframe-simple的build.gradle:
 

//系统启动初始化:自动下载插件
def repoConfig = {all { ArtifactRepository repo ->if (repo instanceof MavenArtifactRepository) {def url = repo.url.toString()if (url.contains('repo1.maven.org/maven2')|| url.contains('repo.maven.org/maven2')|| url.contains('repo.maven.apache.org/maven2')|| url.contains('jcenter.bintray.com')|| url.contains('maven.google.com')|| url.contains('plugins.gradle.org/m2')|| url.contains('repo.spring.io/libs-milestone')|| url.contains('repo.spring.io/plugins-release')|| url.contains('repo.grails.org/grails/core')|| url.contains('repository.apache.org/snapshots')) {println "gradle init: [buildscript.repositories] (${repo.name}: ${repo.url}) removed"remove repo}}}// Maven 镜像聚合了:central、jcenter、google、gradle-pluginmaven { url 'https://maven.aliyun.com/repository/central' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }maven { url 'https://maven.aliyun.com/repository/public/' }mavenLocal() //缺失的库添加到本地
}subprojects {buildscript {repositories repoConfig}repositories repoConfigrepositories {maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}}group = 'org.ccframe'version = '1.0-SNAPSHOT'//---------------------- 版本定义 ----------------------//ext {spring_boot_version = '2.3.12.RELEASE'jul_to_slf4j_version = '1.7.36'spring_version = '5.2.20.RELEASE'spring_cloud_version = '2.2.9.RELEASE'spring_cloud_zookeeper_discovery_version = '2.2.5.RELEASE'zookeeper_version = '3.7.1'spring_data_version = '2.3.9.RELEASE'spring_data_elasticsearch_version = '4.0.9.RELEASE'lombok_version = '1.18.30'common_lang3_version = '3.12.0'hibernate_jpa_version = '1.0.2.Final'hibernate_version = '5.4.33.Final'spring_security_version = '5.3.3.RELEASE'commons_fileupload_version = '1.3.3'jjwt_version = '0.9.1'fastjson_version = '1.2.62'dubbo_version = '3.1.11'commons_io_version = '2.11.0'curator_version = '5.4.0'swagger_version = '2.9.2'shardingsphere_version = '5.2.1'druid_version = '1.1.23'jetcache_version = '2.7.5'redisson_version = '3.19.3' //netty兼容版本mysql_connector_version = '8.0.33'h2_version = '2.2.224'snakeyaml_version = '1.33' //shardingshere依赖elasticsearch_version = '7.8.1'spring_boot_admin_version = '2.3.1'elasticsearch_painless_asm_version = '7.2'dbunit_version = '2.5.4'minio_version = '8.4.6'kryo_version = '5.6.0' // 这个是redission依赖的kryo5_version = '5.5.0' // jetcache还是依赖的这个旧版swagger2_version = '2.9.2'zxing_version = '3.4.1'jackson_version = '2.11.4' //runtime需要单独引入jackson的jarquartz_version = '2.3.2'x_file_storage_version = '2.1.0'aliyun_sdk_oss_version = '3.17.4'okhttp_version = '4.12.0'just_auth_version = '1.16.6'just_auth_starter_version = '1.4.0'dependency_base_libs = [ // 基础依赖库"org.springframework.boot:spring-boot:${spring_boot_version}","org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}","org.springframework.boot:spring-boot-starter-log4j2:${spring_boot_version}","org.apache.commons:commons-lang3:${common_lang3_version}","commons-io:commons-io:${commons_io_version}",'org.apache.commons:commons-collections4:4.4',"org.springframework:spring-context-support:${spring_version}",'uk.org.lidalia:sysout-over-slf4j:1.0.2',  //system out err stacktrace转slf4j,便于统一日志]dependency_db_libs = [ // 数据库相关依赖库"org.springframework.data:spring-data-jpa:${spring_data_version}","org.hibernate.javax.persistence:hibernate-jpa-2.1-api:${hibernate_jpa_version}","org.hibernate:hibernate-core:${hibernate_version}",[lib: "org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter:${shardingsphere_version}",excludes:[[group: 'org.apache.shardingsphere', module: 'shardingsphere-sharding-cosid'], //cosid算法会引用更高版本spring[group: 'io.vertx',  module: 'vertx-mysql-client'] // 该驱动已不使用]],"com.h2database:h2:${h2_version}", // shardingsphere依赖"org.yaml:snakeyaml:${snakeyaml_version}", // shardingsphere版本依赖"com.alibaba:druid:${druid_version}","mysql:mysql-connector-java:${mysql_connector_version}","org.dbunit:dbunit:${dbunit_version}", //不要升级'org.apache.ant:ant:1.9.9' // DBUnit使用]dependency_es_libs = [ // ES依赖库 embeded ES 7.6.2 -> 7.8.1"org.elasticsearch:elasticsearch:${elasticsearch_version}","org.elasticsearch.client:transport:${elasticsearch_version}","org.elasticsearch:elasticsearch-plugin-classloader:${elasticsearch_version}","org.elasticsearch.client:elasticsearch-rest-high-level-client:${elasticsearch_version}","org.elasticsearch.plugin:transport-netty4-client:${elasticsearch_version}","org.ow2.asm:asm:${elasticsearch_painless_asm_version}", //elasticserach依赖"org.springframework.data:spring-data-elasticsearch:${spring_data_elasticsearch_version}"]dependency_zk_libs = [ // embedded ZOOKEEPER依赖库"org.apache.zookeeper:zookeeper:${zookeeper_version}","org.apache.curator:curator-x-discovery:${curator_version}","io.dropwizard.metrics:metrics-core:3.2.6","org.xerial.snappy:snappy-java:1.1.8.4"]dependency_web_libs = [ // web 相关库,"org.springframework.boot:spring-boot-starter-security:${spring_boot_version}","commons-fileupload:commons-fileupload:${commons_fileupload_version}","com.google.zxing:javase:${zxing_version}",'javax.servlet:javax.servlet-api:4.0.1',[lib: 'javax.servlet.jsp:jsp-api:2.2', compileOnly: true]]dependency_security_libs = [ // 权限和三方鉴权相关库,"io.jsonwebtoken:jjwt:${jjwt_version}", // token 方案"org.springframework.boot:spring-boot-starter-security:${spring_boot_version}","me.zhyd.oauth:JustAuth:${just_auth_version}", //多渠道登录"com.xkcoding:justauth-spring-boot-starter:${just_auth_starter_version}"]dependency_webapi_libs = [ // 在线API接口相关库,"io.springfox:springfox-swagger2:${swagger_version}",'io.github.wilson-he:swagger2-spring-boot-starter:1.1.2',[lib: "com.github.xiaoymin:knife4j-spring-boot-autoconfigure:2.0.9",excludes:[[group: 'com.github.xiaoymin', module: 'knife4j-spring']]],'com.github.xiaoymin:knife4j-spring-ui:2.0.9',]dependency_redission_libs = [ // redission缓存相关库"org.redisson:redisson:${redisson_version}","com.esotericsoftware:kryo:${kryo_version}" // redission使用的是这个]dependency_jetcache_libs = [ // redission缓存相关库[lib: "com.alicp.jetcache:jetcache-starter-redis-lettuce:${jetcache_version}",excludes:[[group: 'org.springframework.boot', module: 'spring-boot-starter'],[group: 'org.springframework', module: 'spring-context'],[group: 'org.slf4j', module: 'slf4j-api'],]],"com.esotericsoftware.kryo:kryo5:${kryo5_version}" //混乱的kryo,弄两个包。。。,这个已不再升级,jetcache引入,将来会替换掉]dependency_actuator_libs = [ // 性能监控相关库"org.springframework.boot:spring-boot-starter-actuator:${spring_boot_version}","org.latencyutils:LatencyUtils:2.0.3"]dependency_files_libs = [ // OSS文件系统相关库,OSS实现本地、MINIO、阿里云3个"org.dromara.x-file-storage:x-file-storage-spring:${x_file_storage_version}",  //多存储系统'net.coobird:thumbnailator:0.4.8',"com.squareup.okhttp3:okhttp:${okhttp_version}", //要强制绑定4.X版本,否则MINIO会出错"io.minio:minio:${minio_version}", // minio驱动"com.aliyun.oss:aliyun-sdk-oss:${aliyun_sdk_oss_version}" //阿里云OSS驱动]}//dubbo_version = '3.1.11'//classpath 'io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.0.15.RELEASE'//---------------------- JAVA 编译插件 ----------------------//apply plugin: 'java'apply plugin: 'java-library'apply plugin: 'maven-publish' //发布到本地apply plugin: 'idea'idea {module {downloadSources = true}}//JAVA 文件编码compileJava.options.encoding = 'UTF-8'tasks.withType(JavaCompile) {options.debug = true //输出行号options.debugOptions.debugLevel = "source,lines,vars" //输出行号options.encoding = "UTF-8"}// unset ANDROID_HOME to avoid problems with zxingSystem.setProperty("env.ANDROID_HOME", "");tasks.withType(Copy) {duplicatesStrategy = DuplicatesStrategy.EXCLUDE //忽略resource重复资源}configurations.all {//transitive = false //默认不自动关联依赖,以免打包过大resolutionStrategy.cacheChangingModulesFor 0, 'seconds' //立即检查而不是要过24h,因为有snapshotexclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' // 不要logback要log4j2}//公共需要的库dependencies {compileOnly 'org.projectlombok:lombok:1.18.30'compileOnly "org.springframework.boot:spring-boot-configuration-processor:${spring_boot_version}"annotationProcessor 'org.projectlombok:lombok:1.18.30'annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:${spring_boot_version}"testAnnotationProcessor 'org.projectlombok:lombok:1.18.30'testAnnotationProcessor "org.springframework.boot:spring-boot-configuration-processor:${spring_boot_version}"//参与测试不进行发布testImplementation 'org.projectlombok:lombok:1.18.30'testImplementation 'junit:junit:4.8' //4.11的版本需要额外包}}/**
模组化添加依赖 addSupportLibraries(dependencies, dependency_spring_boot_group)
@param dependencies 上级的dependencies
@param supportLibrary 定义的库列表
@param compileOnly 默认导入方式是否为仅编译compileOnly,定义的库列表可以是字符串,也可以是对象,对象可以包含excludes和transitive属性,属性解释如下:excludes: 需要排除的列表,传入一个对象,对象包括group和module属性。等同与每项书写exclude group: 'xxx', module: 'xxx'transitive: 是否排除下面所有依赖,如果为false,则排除所有。等同于书写: transitive = falseExample1:implementation ("org.springframework.boot:spring-boot:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-starter:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}")书写为:rootProject.addSupportLibraries(dependencies, ["org.springframework.boot:spring-boot:${spring_boot_version}","org.springframework.boot:spring-boot-starter:${spring_boot_version}","org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}"])或者分开引入:rootProject.addSupportLibraries(dependencies, ["org.springframework.boot:spring-boot:${spring_boot_version}"])rootProject.addSupportLibraries(dependencies, ["org.springframework.boot:spring-boot-starter:${spring_boot_version}","org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}"])Example2:compileOnly ("org.springframework.security:spring-security-core:${spring_security_version}")compileOnly ("com.alicp.jetcache:jetcache-starter-redis-lettuce:${jetcache_version}"){exclude group: 'org.springframework.boot', module: 'spring-boot-starter'exclude group: 'org.springframework', module: 'spring-context'exclude group: 'org.slf4j', module: 'slf4j-api'}书写为:rootProject.addSupportLibraries(dependencies, ["org.springframework.security:spring-security-core:${spring_security_version}",[lib: "com.alicp.jetcache:jetcache-starter-redis-lettuce:${jetcache_version}",excludes:[[group: 'org.springframework.boot', module: 'spring-boot-starter'],[group: 'org.springframework', module: 'spring-context'],[group: 'org.slf4j', module: 'slf4j-api']]]],true)Example3:implementation ("org.xerial.snappy:snappy-java:1.1.8.4") // embedded ZOOKEEPER依赖,minio会提供compileOnly ("org.springframework.data:spring-data-elasticsearch:${spring_data_elasticsearch_version}"){transitive = false}书写为:rootProject.addSupportLibraries(dependencies, ["org.xerial.snappy:snappy-java:1.1.8.4",[lib: "org.springframework.data:spring-data-elasticsearch:${spring_data_elasticsearch_version}", transitive: false, compileOnly: true]])这样就可以把每个开源模块需要的库都定义为一个列表,按需引入*/
def addSupportLibraries(dependencies, supportLibrary, compileOnly = false){supportLibrary.each { library -> {if (library instanceof String || library instanceof org.codehaus.groovy.runtime.GStringImpl) {if (compileOnly) {dependencies.compileOnly library} else {dependencies.implementation library}} else { // 使用对象,定义每个属性var ifCompile = compileOnlyif(library?.compileOnly) {ifCompile = library.compileOnly //内部定义的优先级更高}var doResult;// 先执行操作if (ifCompile) {doResult = dependencies.compileOnly library.lib} else {doResult = dependencies.implementation library.lib}// 操作excludeif (library?.excludes) {library.excludes.each { excludeObj ->  {doResult.exclude(excludeObj)}}}// 操作 transitive = falseif (library?.transitive == false) {doResult.exclude(module: '*')}}}}
}

这样按照基础功能域划分成了11个块:

  1. 基础依赖库
  2. 数据库相关依赖库
  3. ES依赖库 embeded ES
  4. embedded ZOOKEEPER依赖库
  5. web 相关库
  6. 权限和三方鉴权相关库
  7. 在线API接口相关库
  8. redission缓存相关库
  9. jetcache缓存相关库
  10. 性能监控相关库
  11. OSS文件系统相关库

需要时直接导入对应的功能组即可,可以方便的在子模块里复用,统一在主模块里维护。

原来子项目ccframe-service的build.gradle里的dependencies:

dependencies {implementation project(':ccframe-common')implementation project(':ccframe-api')implementation ("org.springframework.boot:spring-boot:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-autoconfigure:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-starter-quartz:${spring_boot_version}")implementation ("org.apache.dubbo:dubbo-spring-boot-starter:${dubbo_version}")implementation ("org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter:${shardingsphere_version}") {exclude group: 'org.apache.shardingsphere', module: 'shardingsphere-sharding-cosid' //cosid算法会引用更高版本spring}implementation ("org.springframework.boot:spring-boot-starter-log4j2:${spring_boot_version}")implementation ("org.springframework.boot:spring-boot-starter-actuator:${spring_boot_version}")//implementation "org.springframework.boot:spring-boot-starter-data-redis:${spring_boot_version}"implementation ("org.redisson:redisson:${redisson_version}")implementation ("org.springframework:spring-context-support:${spring_version}")implementation ("org.springframework.data:spring-data-elasticsearch:${spring_data_elasticsearch_version}")implementation ("org.apache.commons:commons-lang3:${common_lang3_version}")implementation ("org.springframework.data:spring-data-jpa:${spring_data_version}")implementation ("commons-io:commons-io:${commons_io_version}")//implementation ("org.apache.curator:curator-x-discovery:${curator_version}") //zk需要implementation ("com.alibaba:druid:${druid_version}")implementation ("mysql:mysql-connector-java:${mysql_connector_version}")implementation ("org.hibernate:hibernate-core:${hibernate_version}")//embeded ES 7.6.2 -> 7.8.1implementation ("org.elasticsearch:elasticsearch:${elasticsearch_version}")implementation ("org.elasticsearch.client:transport:${elasticsearch_version}")implementation ("org.elasticsearch:elasticsearch-plugin-classloader:${elasticsearch_version}")implementation ("org.elasticsearch.client:elasticsearch-rest-high-level-client:${elasticsearch_version}")implementation ("org.elasticsearch.plugin:transport-netty4-client:${elasticsearch_version}")implementation ("com.alicp.jetcache:jetcache-starter-redis-lettuce:${jetcache_version}"){exclude group: 'org.springframework.boot', module: 'spring-boot-starter'exclude group: 'org.springframework', module: 'spring-context'exclude group: 'org.slf4j', module: 'slf4j-api'}implementation ("com.h2database:h2:${h2_version}")// shardingsphere依赖implementation ("org.yaml:snakeyaml:${snakeyaml_version}") // shardingsphere版本依赖implementation ("org.ow2.asm:asm:${elasticsearch_painless_asm_version}") //elasticserach依赖implementation ("org.dbunit:dbunit:${dbunit_version}") //不要升级implementation ('org.apache.ant:ant:1.9.9') // DBUnit使用implementation ("io.minio:minio:${minio_version}") //minio分布式文件//implementation ("org.quartz-scheduler:quartz-jobs:${quartz_version}")implementation ("com.esotericsoftware:kryo:${kryo_version}") //混乱的kryo,弄两个包,被不同的项目引用。。。implementation ("com.esotericsoftware.kryo:kryo5:${kryo5_version}") //混乱的kryo,弄两个包。。。,这个已不再升级implementation ("io.dropwizard.metrics:metrics-core:3.2.6") // embedded ZOOKEEPER依赖//下面几个是服务器独立运行时需要的jarimplementation ("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jackson_version}")implementation ("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jackson_version}")implementation ("org.latencyutils:LatencyUtils:2.0.3")implementation ("org.dromara.x-file-storage:x-file-storage-spring:${x_file_storage_version}") //多存储系统implementation ("com.squareup.okhttp3:okhttp:${okhttp_version}") //要强制绑定4.X版本,否则MINIO会出错//implementation "org.slf4j:jul-to-slf4j:${jul_to_slf4j_version}"//implementation "org.slf4j:jul-to-slf4j:${jul_to_slf4j_version}"implementation ('org.apache.commons:commons-collections4:4.4')implementation ('org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final')implementation ('uk.org.lidalia:sysout-over-slf4j:1.0.2') //system out err stacktrace转slf4j,便于统一日志implementation ('net.coobird:thumbnailator:0.4.8') //缩略图支持,下一步替换统一OSS引擎implementation ('javax.servlet:javax.servlet-api:4.0.1')compileOnly ('javax.servlet.jsp:jsp-api:2.2')
}

在根项目按照功能块划分后,使用    rootProject.addSupportLibraries 来导入,这样就清晰多了:
 

dependencies {implementation project(':ccframe-common')implementation project(':ccframe-api')rootProject.addSupportLibraries(dependencies, dependency_base_libs)rootProject.addSupportLibraries(dependencies, dependency_es_libs)rootProject.addSupportLibraries(dependencies, dependency_db_libs)rootProject.addSupportLibraries(dependencies, dependency_jetcache_libs)rootProject.addSupportLibraries(dependencies, dependency_redission_libs)rootProject.addSupportLibraries(dependencies, dependency_zk_libs)rootProject.addSupportLibraries(dependencies, dependency_files_libs)rootProject.addSupportLibraries(dependencies, dependency_actuator_libs)implementation ("org.apache.dubbo:dubbo-spring-boot-starter:${dubbo_version}")implementation ("org.springframework.boot:spring-boot-starter-quartz:${spring_boot_version}")
}

其中dubbo和quart只需要一个包即可统一维护,故不用分组管理。

仅编译的common模块dependencies 重新整理后如下:

dependencies {implementation project(':ccframe-api')rootProject.addSupportLibraries(dependencies, dependency_base_libs, true)rootProject.addSupportLibraries(dependencies, dependency_es_libs, true)rootProject.addSupportLibraries(dependencies, dependency_db_libs, true)rootProject.addSupportLibraries(dependencies, dependency_jetcache_libs, true)rootProject.addSupportLibraries(dependencies, dependency_redission_libs, true)rootProject.addSupportLibraries(dependencies, dependency_zk_libs, true)rootProject.addSupportLibraries(dependencies, dependency_web_libs, true)rootProject.addSupportLibraries(dependencies, dependency_files_libs, true)rootProject.addSupportLibraries(dependencies, dependency_actuator_libs, true)compileOnly ("org.apache.dubbo:dubbo:${dubbo_version}")compileOnly ("io.jsonwebtoken:jjwt:${jjwt_version}") //token方案
}

看看,改造后是不是清爽多了。这样我们只需要在根项目的build.gradle统一维护列表,在子项目里按需引入整个组件依赖模块就行了,不用再逐条去implementation。方便,太方便了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白嫖阿里云DSW做AI绘画的几点技巧(老鸟参考,新手免入)

白嫖方法就不说了,选择A10显卡或者V100显卡,能画些图,还能用三个月。可以感受一下顶级显卡的速度,当生产力工具肯定是不行的,毕竟5000个使用量用起来很快的。 问题一: 镜像版本选择-官方提供二个镜像&…

《LeetCode力扣练习》代码随想录——二叉树(左叶子之和---Java)

《LeetCode力扣练习》代码随想录——二叉树(左叶子之和—Java) 刷题思路来源于 代码随想录 404. 左叶子之和 二叉树-后序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode…

Windows wget安装与使用

wget安装 链接: https://eternallybored.org/misc/wget/ 下载了ZIP格式,但是解压后发现exe文件无法解压,所以直接下载了exe文件。 下载后将exe文件放至路径:C:\Windows\System32 winR → cmd 输入: wget --help&…

Unity笔记:C#基础(1)

杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中,string是不可变的,这意味着对string对象的操作通常会返回一个新的string对象,而不会修改原始的string对象。因此,几乎所有涉及更改string内…

鞋服品牌怎样合理把控订货深度和宽度

在鞋服品牌的运营管理中,订货深度和宽度是两个至关重要的概念。订货深度指的是某一款式或规格的产品数量,而订货宽度则代表品牌所涵盖的产品种类和款式。合理把控订货深度和宽度对于品牌的库存管理、销售情况以及顾客满意度都有着深远的影响。本文将探讨…

【牛客】VL74 异步复位同步释放

描述 题目描述: 请使用异步复位同步释放来将输入数据a存储到寄存器中,并画图说明异步复位同步释放的机制原理 信号示意图: clk为时钟 rst_n为低电平复位 d信号输入 dout信号输出 波形示意图: 输入描述: clk为时…

Qt: 事件过滤器的更多用法

不懂事件循环怎么回事的可以看下面的文章 Qt事件循环完整流程 常规使用 定义一个窗口MainWindow ,之后在窗口里添加一个事件过滤函数eventFilter,将窗口的某一个或一些字控件安装上事件过滤器。 这种情况下MainWindow 就是pushButton11的时间过滤器&am…

MRI基础--k空间特性

目录 k空间中心亮的原因 k空间中心和边缘信号幅值比较 参考文献 k空间中心亮的原因 k空间的正中点是kx = ky = 0的点。该位置对应于图像的傅里叶表示中的常数项,其大小与平均图像亮度相同。该中心点具有 k 空间中任何其他点的最高幅度,最好在 3D 表示中看到。<

AcWing 107. 超快速排序

#include<bits/stdc.h>using namespace std;typedef long long LL;const int N50000010;//a 是原来的数组&#xff0c;temp 是临时数组 int a[N],temp[N];//因为元素有 500000 个&#xff0c;逆序对的数目可能会非常多 //假设按照降序排列&#xff0c;那么将有 n(n-1)(n-…

许多人可能还不了解这个信息差:美赛的第一批 EI 已经录用,不用再犹豫啦

格局打开&#xff0c;美赛论文转学术论文发表 &#x1f680;&#x1f680; 各位同学&#xff0c;美赛已经结束了一段时间&#xff0c;你们是否还在焦急地等待最终成绩的公布&#xff1f;一些有远见的同学已经提前收到了一份喜讯&#xff1a;他们的美赛论文已被转化为学术论文并…

MySQL深入——25

Join语句如何优化? Join语句的两种算法&#xff0c;分别为Index Nested-Loop Join和Block Nested-Loop Join NLJ在大表Join当中还不错&#xff0c;但BNL在大表join时性能就差很多&#xff0c;很耗CPU资源。 如何优化这两个算法 创建t1&#xff0c;t2算法&#xff0c;在t1中…

Gitlab部署流程

安装准备 需要开启ssh&#xff1a;&#xff08;已开启可跳过&#xff09; sudo systemctl status sshd sudo systemctl enable sshd sudo systemctl start sshd防火墙开放http、https服务&#xff1a;&#xff08;已关闭防火墙可跳过&#xff09; sudo systemctl status fir…

CPU设计实战-加载和存储指令(2)

目录 一 ll和sc指令说明 二 ll和sc指令的实现 1 llbit寄存器 2 译码阶段 3 访存阶段 4 Load相关问题 5 流水线在取指阶段暂停 本章介绍两个比较特殊的加载存储指令ll和sc&#xff0c;这两个指令的存在用于实现信号量机制。 信号量机制&#xff1a;在多线程中为了保证某个…

smplx pkl格式可视化

smplx pkl格式可视化 import glob import os import pickleimport torch import numpy as npfrom smplpytorch.pytorch.smpl_layer import SMPL_Layer from display_utils import display_model, display_model_continuousfrom matplotlib import pyplot as plt from matplotl…

P1551 亲戚题解

题目 若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图&#xff0c;求任意给出的两个人是否具有亲戚关系。规定&#xff1a;x 和y是亲戚&#xff0c;y和z是亲戚&#xff0c;那么x和z也是亲戚。如果x&…

社区服务类创业项目推荐:抓住社区商业新机遇

大家好&#xff0c;我是一名90后鲜奶吧创业者&#xff0c;目前在社区经营5年时间&#xff0c;今天我想和大家分享一些关于社区服务类创业项目的推荐&#xff0c;都是这么多年我见证过生意最好的店面。 1、社区便利店&#xff1a; 随着人们生活节奏的加快&#xff0c;对便利购…

【Linux实践室】Linux常用命令:文件操作|文件夹操作

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux文件操作2.1.1 &#x1f47b;创建文件2…

2024年第二届智能制造与自动化前沿国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第二届智能制造与自动化前沿国际会议&#xff08;CFIMA 2024&#xff09; 会议时间&#xff1a;2024年8月23 -25日 召开地点&#xff1a;中国包头 大会官网&#xff1a;www.cfima.org 随着全球新一轮科技革命和产业变革突飞猛进&#xff0c;…

Java Web开发---复试Tips复习

***********&#xff08;自用&#xff0c;摘录自各种文章和自己总结&#xff09;********** 小知识点理解 Web Web应用开发主要是基于浏览器的应用程序开发。一个Web应用由多部分组成 java web就是用java语言开发出可在万维网上浏览的程序 Web应用程序编写完后&#xff0c;…

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器&#xff1f; es在创建倒排索引时需要对文档分词&#xff1b;在搜索时&#xff0c;需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试&#xff1a; GET /_analyze {"analyzer": "…