插件準(zhǔn)備:maven helper 解決包沖突必備神器峭梳。
目標(biāo):將原始項(xiàng)目的spring 版本4.3.22.RELEASE,升級(jí)為springboot 的2.3.5.RELEASE版本,步驟如下:
-
加入springboot包飒焦,并且改war包為jar包
<packaging>jar</packaging> <dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${version.springboot}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<!--spring boot--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
同步springframework版本號(hào)典奉,也就是移除掉springframework系列包中指定的
version
,spring的版本會(huì)自動(dòng)和dependencyManagement
的spring版本一致-
創(chuàng)建啟動(dòng)類鳞芙,把原來(lái)的xml的配置文件包含進(jìn)去
@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class, DataSourceAutoConfiguration.class, RedisAutoConfiguration.class, KafkaAutoConfiguration.class, MongoDataAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class}) @ImportResource(locations = {"/spring/applicationContext.xml"}) public class Application { public static void main(String[] args) { SpringApplication.run(CustNotifyApplication .class, args); } }
增加springboot打包插件
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.demo.manage.Application</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
-
創(chuàng)建application.yaml
server: port: 8080 shutdown: graceful spring: application: name: demo-server profiles: active: ${profile.active} main: allow-bean-definition-overriding: true jackson: time-zone: GMT+8
-
干掉
host-bind.properties
眷柔,把dubbo host的配置放到application.yaml
中server: port: 8080 shutdown: graceful spring: application: name: demo-server profiles: active: ${profile.active} main: allow-bean-definition-overriding: true jackson: time-zone: GMT+8 dubbo: protocol: host: 127.0.0.1
-
原先的disconf是xml方式配置的,看得不舒服原朝,索性干掉了下面的xml配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- disconf配置 --> <bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean" destroy-method="destroy"> <property name="scanPackage" value="com.demo.manage" /> </bean> <bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond" init-method="init" destroy-method="destroy"> </bean> <bean id="configproperties_no_reloadable_disconf" class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean"> <property name="locations"> <list> <value>redis.properties</value> <value>dubbo.properties</value> <value>kafka.properties</value> <value>kafka.consumer.config.properties</value> <value>db.properties</value> </list> </property> </bean> <bean id="hostBindProperties" class="com.demo.common.util.PropertiesFactoryBean"> <property name="fileLists"> <list> <value>config/host-bind.properties</value> </list> </property> </bean> <!-- 使用托管方式的disconf配置(無(wú)代碼侵入, 配置更改不會(huì)自動(dòng)reload) --> <bean id="propertyConfigurerForNoReload" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreResourceNotFound" value="false" /> <property name="ignoreUnresolvablePlaceholders" value="false" /> <property name="propertiesArray"> <list> <ref bean="configproperties_no_reloadable_disconf" /> <ref bean="hostBindProperties" /> </list> </property> </bean> </beans>
在application.yaml
中加入disconf配置:
server:
port: 8080
shutdown: graceful
spring:
application:
name: demo-server
profiles:
active: ${profile.active}
main:
allow-bean-definition-overriding: true
jackson:
time-zone: GMT+8
dubbo:
protocol:
host: 127.0.0.1
# disconf config
disconf:
scanPackage: com.demo.manage
version: ${disconf.version}
env: ${disconf.env}
conf_server_host: ${disconf.server.host}
files: redis.properties,dubbo.properties,kafka.properties,kafka.consumer.config.properties,db.properties
app: demo-server
debug: false
enable:
remote:
conf: true
conf_server_url_retry_times: 3
conf_server_url_retry_sleep_seconds: 5
user_define_download_dir: /app/spring-boot/demo-server/disconf
enable_local_download_dir_in_class_path: false
在pom中加入了springboot的disconf啟動(dòng)包
<dependency>
<groupId>com.fcbox</groupId>
<artifactId>spring-boot-starter-disconf</artifactId>
<version>2.0.0</version>
</dependency>
-
修改環(huán)境變量配置命名規(guī)范驯嘱。
將pom中的
profiles.activation
修改為profile.active
-
logback文件按照配置環(huán)境區(qū)分配置:
<springProfile name="dev,local,per,pet,uat,uat1,uat2,uat3,uat4,uat5,uat6,uat7"> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="notify_log"/> <appender-ref ref="error_log"/> </root> </springProfile> <springProfile name="prd,stg"> <root level="INFO"> <appender-ref ref="notify_log"/> <appender-ref ref="error_log"/> </root> </springProfile>
-
第三方sdk包中使用classpath讀取不到配置文件,可以使用絕對(duì)路徑加載喳坠,如:
<bean id="personalPaymentService" class="com.demo.payment.client.impl.PersonalPaymentServiceImpl" > <property name="configPath" value="file:/app/spring-boot/demo-server/disconf/payment_common.properties" /> </bean>
-
包沖突問題
-
jackson版本沖突鞠评,報(bào)錯(cuò)信息:
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/datatype/jsr310/ser/ZoneIdSerializer
。直接升級(jí)到最高版本2.12.0
丙笋,然后干掉版本不一致的jackson包,涉及的jackson包為:<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.0</version> <exclusions> <exclusion> <artifactId>jackson-core</artifactId> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> <exclusion> <artifactId>jackson-annotations</artifactId> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.12.0</version> </dependency>
-
log4j包缺失報(bào)錯(cuò)
java.lang.ClassNotFoundException: org.apache.log4j.Logger
谢澈。dubbo使用了 log4j所以需要引入log4j包:<dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.30</version> </dependency>
jedis包沖突
java.lang.ClassNotFoundException: redis.clients.jedis.util.Pool
排除掉jedis低版本包
-
-
Redis配置讀取本地文件煌贴,需要改為Spring-map加載
<bean id="mallResourcePropertySource" class="org.springframework.core.io.support.ResourcePropertySource"> <constructor-arg name="name" value="mall-redis-conf.properties"/> <constructor-arg name="resource" value="classpath:mall-redis-conf.properties"/> </bean> 上面代碼改為 <bean id="resourcePropertySource" class="org.springframework.core.env.PropertiesPropertySource"> <constructor-arg name="name" value="mall-redis-conf.properties"/> <constructor-arg name="source"> <map> <entry key="spring.redis.cluster.max-redirects" value="${spring.redis.cluster.max-redirects}" /> <entry key="spring.redis.cluster.nodes" value="${spring.redis.cluster.nodes}"/> </map> </constructor-arg> </bean>
從spring升級(jí)到springboot并不復(fù)雜,本來(lái)springboot就是spring框架的擴(kuò)展锥忿,只需要把spring的版本號(hào)和springboot中的保持一致牛郑,注意下classpath的打包路徑和解決掉依賴的沖突包即可