前言
终于开始比较重要的部分了。
可以先参考:
【配置中心】xxl-conf配置4 - spring mvc客户端读取xxl-conf的配置信息
配置过程
gradle根据环境不同打包不同的配置文件
注意,在没有配置中心之前,都是用properties这种文件做配置的,其中很重要的一环是,如何在不同环境–包括开发环境,测试环境,线上环境等等切换不同的配置,不过,有了配置中心就不用做这一步了,剩下需要做的其实是,根据不同的打包方式确认打包参数的内容
下面来进行相关配置
要点说明1、gradle接收环境变量
首先,要明确,在打包的时候是可以用命令行自定义属性的,例如:
即,gradle命令后面可以带 -P 或者 -D来携带参数,我们采用的是后一种:
下面我们添加一个小测试来进行说明:
在根目录的build.gradle上面添加以下代码
/***定义项目环境变量***/
String _ENV_="test" //默认是测试环境
if(System.getProperty("env")!=null&&!System.getProperty("env").isEmpty()){
String tmpEnv=System.getProperty("env").toLowerCase().trim();
if(!tmpEnv.equals("test")
&&!tmpEnv.equals("ppe")
&&!tmpEnv.equals("product")){
println "!!!您自定义的环境无效!环境变量只能在test、ppe、product中三选一!!";
}
else{
_ENV_=tmpEnv;
}
}
println "当前指定环境为:$_ENV_"
/***定义项目环境变量 end***/
然后在FileServerWebApp下,执行命令看看,譬如:
gradle -q idea -Denv=product
可以看到这样能够成功传入环境参数。
要点说明2、根据环境变量以及设置的配置中心ip等参数,生成配置文件
有空的话看看这个,基本上就用到复制文件,替换变量而已。
第一,在根项目的build.gradle中设置xxl-conf配置中心的相关参数,譬如:
代码如下:
/***rootProject配置 开始***/
/***这个配置中心是需要手工配置的。***/
ext{
AppSetting = [
//--环境变量由系统自动判断及接收,在编译时候添加 -Denv=test或者ppe或者product即可。
"env" : _ENV_,
//配置中心服务器地址
"xxl_conf_admin_address":"http://localhost:7788/",
//配置中心的密钥--注意,要与xxl-conf-admin设置的密钥一致,没有的话就留空
"xxl_conf_access_token":"",
//--配置中心会在本地建立一个镜像文件
"xxl_conf_mirrorfile":
"/data/sapplogs/xxl-conf/xxl-conf-mirror-sample.properties"
]
}
/***rootProject配置 结束***/
然后,准备一份需要被替换的配置文件,譬如,我就在根目录下面添加了一份这样的文件:
在根目录的conf下面有一份xxl-conf.properties,里面的内容有:
# xxl-conf
xxl.conf.admin.address=@xxl_conf_admin_address@
xxl.conf.env=@env@
xxl.conf.access.token=@xxl_conf_access_token@
xxl.conf.mirrorfile=@xxl_conf_mirrorfile@
注意到没有,@@之间的就是变量名称,这个与ext下面的AppSetting是一一对应的-----换而言之,我们等下就是要用AppSetting里面的变量来替换掉符号,然后生成一个可以用的配置文件。
然后,在根目录下面自定义一个所有模块项目都可以使用的任务,里面的大意是,一旦执行这个任务就会将根目录下面的xxl-conf.properties文件替换掉正常变量以后复制到模块的对应位置。
任务的定义如下:
好了,现在根目录的全部配置是这个:
plugins {
id 'java'
}
group 'net.w2p'
version '1.0-SNAPSHOT'
/***定义项目环境变量***/
String _ENV_="test" //默认是测试环境
if(System.getProperty("env")!=null&&!System.getProperty("env").isEmpty()){
String tmpEnv=System.getProperty("env").toLowerCase().trim();
if(!tmpEnv.equals("test")
&&!tmpEnv.equals("ppe")
&&!tmpEnv.equals("product")){
println "!!!您自定义的环境无效!环境变量只能在test、ppe、product中三选一!!";
}
else{
_ENV_=tmpEnv;
}
}
println "当前指定环境为:$_ENV_"
/***定义项目环境变量 end***/
/***rootProject配置 开始***/
/***这个配置中心是需要手工配置的。***/
ext{
AppSetting = [
//--环境变量由系统自动判断及接收,在编译时候添加 -Denv=test或者ppe或者product即可。
"env" : _ENV_,
//配置中心服务器地址
"xxl_conf_admin_address":"http://localhost:7788/",
//配置中心的密钥--注意,要与xxl-conf-admin设置的密钥一致,没有的话就留空
"xxl_conf_access_token":"",
//--配置中心会在本地建立一个镜像文件
"xxl_conf_mirrorfile":
"/data/sapplogs/xxl-conf/xxl-conf-mirror-sample.properties"
]
}
/***rootProject配置 结束***/
/***所有项目共通***/
allprojects {
sourceCompatibility = 1.8
targetCompatibility = 1.8
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'groovy'
ext{
/***常见或主要第三方依赖版本号定义 begin***/
globalSpringVersion = "5.1.4.RELEASE"
globalSpringDataJpaVersion ="2.1.2.RELEASE"
globalSpringBootVersion = '2.1.1.RELEASE'
globalFastJsonVersion="1.2.54"
globalMyBatisVersion="3.4.6"
globalMyBatisSpringVersion="1.3.2" //mybatis-spring
globalGoogleGuavaVersion="27.0.1-jre"
globalDom4jVersion="1.6.1"
globalJavaMailVersion="1.4.7"
globalJsoupVersion="1.11.3" //--一个过滤html危险字符串api,用于web安全
globalQuartzVersion="2.3.0"
globalFlexmarkVersion="0.34.32" //--java对markdown语法的解释以及翻译api
globalPostgresqlJdbcDriverVersion="42.2.5"
globalQiniuSdkVersion="7.2.18"//--七牛上传下载客户端sdk
globalApacheAntVersion="1.10.5"
globalGoogleZXingVersion="3.3.3"
globalFastdfsClientVersion="1.27"
globalLog4jVersion="1.2.17"
globalSlf4jVersion="1.7.25"
globalRedisClientVersion="2.10.1"
globalFreemarkerVersion="2.3.28"
globalSpringBootStaterVersionOfMyBatis="1.3.2"
globalMysqlJdbcDriverVersion="5.1.40"
globalApacheCommonLang3Version="3.8.1"
/***常见或主要第三方依赖版本号定义 end***/
/****常见或者程序主要引用依赖定义 begin****/
//--这个是spring boot要直接compile进去的框架。
ref4SpringBoot=[
/***spring boot 相关依赖***/
"org.springframework.boot:spring-boot:$globalSpringBootVersion",
"org.springframework.boot:spring-boot-starter:$globalSpringBootVersion",
"org.springframework.boot:spring-boot-starter-web:$globalSpringBootVersion",
"org.springframework.boot:spring-boot-starter-freemarker:$globalSpringBootVersion",
"org.springframework.boot:spring-boot-devtools:$globalSpringBootVersion"
]
//--这个是spring boot要compileOnly的类库
ref4SpringBootProvided=[
"org.springframework.boot:spring-boot-dependencies:$globalSpringBootVersion",
]
//--这个是spring boot的测试框架,用testCompile导入
ref4SpringBootTest=[
"org.springframework.boot:spring-boot-starter-test:$globalSpringBootVersion"
]
//--spring框架api
ref4SpringFramework=[
"org.springframework:spring-web:$globalSpringVersion",
"org.springframework:spring-webmvc:$globalSpringVersion",
"org.springframework:spring-jdbc:$globalSpringVersion",
"org.springframework:spring-context-support:$globalSpringVersion",
"org.springframework.data:spring-data-jpa:$globalSpringDataJpaVersion",
"org.springframework:spring-test:$globalSpringVersion"
]
//--jsp&servlet等javaweb容器api,通常都用 compileOnly引用的。
ref4JspAndServletApi=[
"javax.servlet:javax.servlet-api:3.1.0",
"javax.servlet.jsp:jsp-api:2.2",
"javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1"
]
//--jstl等java web的tag标准api,引入的话要用compile
ref4Jstl=[
'taglibs:standard:1.1.2',
'jstl:jstl:1.2'
]
//--mybatis
ref4MyBatis=[
"org.mybatis:mybatis:$globalMyBatisVersion"
]
ref4MybatisSpring=[
"org.mybatis:mybatis-spring:$globalMyBatisSpringVersion"
]
//--这是apache common 类库引用的地址
ref4ApacheCommons = [
'commons-lang:commons-lang:2.6',
'commons-logging:commons-logging:1.2',
'commons-io:commons-io:2.5',
'commons-fileupload:commons-fileupload:1.3.2',
'commons-codec:commons-codec:1.10',
'commons-beanutils:commons-beanutils:1.9.3',
'commons-httpclient:commons-httpclient:3.1',
'org.apache.httpcomponents:fluent-hc:4.3.6',
'org.apache.httpcomponents:httpclient:4.5.3',
'org.apache.httpcomponents:httpclient-cache:4.5.3',
'org.apache.httpcomponents:httpcore:4.4.8',
'org.apache.httpcomponents:httpmime:4.5.3',
'org.apache.curator:curator-framework:4.0.1',
'org.jfree:jfreechart:1.0.19',
'org.apache.velocity:velocity:1.7',
'org.apache.poi:poi:3.16'
]
//--redis client
ref4RedisClient=["redis.clients:jedis:$globalRedisClientVersion"]
ref4Freemarker=["org.freemarker:freemarker:$globalFreemarkerVersion"]
//--这是阿里云短信引用的第三方类库
ref4AliYunSms=[
'com.aliyun:aliyun-java-sdk-core:3.2.8',
'com.aliyun:aliyun-java-sdk-dysmsapi:1.1.0'
]
//--阿里云图片裁剪
ref4AliSimpleImage=[
'com.alibaba:simpleimage:1.2.3'
]
//--阿里fast json引用地址
ref4FastJson=["com.alibaba:fastjson:$globalFastJsonVersion"]
//--json-lib引用地址
ref4JsonLib=["net.sf.json-lib:json-lib:2.4:jdk15"]
//--jdom1&jdom2以及相关api
ref4Jdom=[
'org.jdom:jdom2:2.0.6',
'org.jdom:jdom:1.1.3',
'joda-time:joda-time:2.9.7'
]
//--google guava
ref4GoogleGuava=["com.google.guava:guava:$globalGoogleGuavaVersion"]
//--dom4j
ref4Dom4j=["dom4j:dom4j:$globalDom4jVersion"]
ref4JavaMail=["javax.mail:mail:$globalJavaMailVersion"]
ref4Jsoup=["org.jsoup:jsoup:$globalJsoupVersion"]
ref4Quartz=[
"org.quartz-scheduler:quartz:$globalQuartzVersion",
"org.quartz-scheduler:quartz-jobs:$globalQuartzVersion"
]
ref4Flexmark=[
"com.vladsch.flexmark:flexmark-all:$globalFlexmarkVersion"
]
ref4PostgresqlJdbcDriver=[
"org.postgresql:postgresql:$globalPostgresqlJdbcDriverVersion"
]
ref4QiuniuSdkVersion=[
"com.qiniu:qiniu-java-sdk:$globalQiniuSdkVersion"
]
ref4ApacheAnt=["org.apache.ant:ant:$globalApacheAntVersion"]
//--二维码
ref4ZXing=[
"com.google.zxing:core:$globalGoogleZXingVersion",
"com.google.zxing:javase:$globalGoogleZXingVersion"
]
ref4FastdfsClient=["cn.bestwu:fastdfs-client-java:$globalFastdfsClientVersion"]
ref4Log4j=["log4j:log4j:$globalLog4jVersion"]
ref4Slf4jToLog4j=["org.slf4j:slf4j-log4j12:$globalSlf4jVersion"]
/****常见或者程序主要引用依赖定义 end****/
}
idea {
module {
inheritOutputDirs = true
}
}
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
tasks.withType(GroovyCompile) {
groovyOptions.encoding = "MacRoman"
}
repositories {
maven{
//更换为阿里的仓库
url 'http://maven.aliyun.com/nexus/content/groups/public'
}
//有些jar包在中央仓库是没有的,需要手动添加上去
// flatDir { dirs 'local_jars' }
// mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
/****自定义全局任务 begin****/
task compileConfig{
}
compileConfig << {
println "正在编译替换配置中心的配置文件,请稍后......."
println "根项目目录为:$rootProject.rootDir"
println "当前模块目录为:$project.projectDir"
/***将配置文件复制到子模块的对应位置--当然,会替换掉相关变量****/
copy {
from "${rootProject.rootDir}/conf/"
into "${project.projectDir}/src/main/resources/conf"
filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: rootProject.AppSetting)
}
}
/****自定义全局任务 end****/
}
下面,在FileServerWebApp目录下面执行compileConfig,查看输出的结果:
开始时候:
然后执行 product环境的配置生成:
好了,执行ppe的环境生成:
额,很多时候开发就是很麻烦的一件事,因为你要从a走到b往往不是一条直路,需要你绕道,跨栏,跳坑的。在配置xxl-conf的时候也是绕不开配置文件的。
结语
光是gradle的一些内容都已经要花很大的篇幅了。