序文
まず、対応するバージョンを選択します
第二に、アップグレード前の考慮事項
第三に、変更のpom.xml依存性
四、Mavenはアップグレードを頼ります
第五に、設定ファイルのアップグレード
修飾された6つのコード層
参考資料
序文
企業は、既存の技術インフラストラクチャをアップグレードする必要があるとして、springbootのバージョンは、上記2.xのにアップグレードする必要があります、対応するSpringcloudバージョンもアップグレードする必要があります。プロセスの次のエスカレーションと要約を作ります。
まず、対応するバージョンを選択します
SpringbootとSpringcloudバージョン対応では、公式のリンクを参照することができ、関連性SpringbootとSpringcloudバージョンについて、あり:springbootとバージョン間のspringcloudの対応、紙Springboot-2.1.9とバージョンでは、例としてSpringcloud-Greenwich.SR2デモをアップグレードします。
第二に、アップグレード前の考慮事項
注: JDK8 2.xおよび上記、およびJDK9の新機能のサポートにspringboot依存。だから、プロジェクトのJDKのバージョンを確認します。
注:春のフレームワーク5+とTomcat 8.5+:一部のサードパーティライブラリのspringboot-2.xでは、最も重要な例をバージョンにアップグレードされています。したがって、たとえば、春4は、新しいバージョンでは、廃棄することができる統合のために:グアバキャッシュ
第三に、変更のpom.xml依存性
プロセスは、例えば、springboot開発プロジェクト仕様で親プロジェクト定義の親を示し、その後Springcloud依存的に導入されます。次の3つのステップに分かれてのpom.xmlファイルの変更:
- 親ラベルの内容を変更し、プロジェクトエンジニアリングの父親はspringboot-2.xのに設定されています:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath/> </parent>
- コンテンツのプロパティ]タブには、このようなspringcloudバージョンなど、いくつかの基本的なプロパティの値を設定変更します。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> </properties>
- 新dependencyManagementラベルの内容に依存新しいspringcloud:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- あなたはアリ倉庫の鏡像を変更することなくsettings.xmlのソースは、jarファイルをダウンロードするために使用することができ、のpom.xmlに以下を追加することができます。
<repositories> <repository> <id>maven-ali</id> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> </repositories>
待っているのjarパッケージがダウンロードされた後、アップグレードの最初のステップは、次のjarファイルを管理し、完了しています。
四、Mavenはアップグレードを頼ります
アップグレード版の後、それは今あなたがコンテンツの依存関係や設定ファイルの編集を開始したいので、互換性のないジャーパッケージと設定ファイルの多くにつながります。注:IDEAは、開発者が開発ツールとしてアップグレードプロジェクトの使用を開始することを期待は、この記事では、ソフトウェアのスクリーンショットは、IDEA、IDEAからのものであり、援助プロジェクトのアップグレードを完了することを期待しています。
あなたが示すように、バージョン番号が「不明」であり、右側IDEA、Mavenのビュー、バージョン依存性の障害を確認することができ、例えば、ユーレカに変更する、すなわち必要性たartifactIdに新しいバージョンが属するユーレカあります変更は、正しいたartifactIdへの変更をすることができます。
Eclipseを使用している場合は、次のようにjarファイルのパッケージダウンロードプロセスが与えられます。
-
ユーレカ・クライアント-たartifactIdの変更:
1.5.7的版本中,eureka依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> 2.x以上的版本,eureka依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
ユーレカ・サーバーたartifactIdの変更:
1.5.7的版本中,eureka依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> 2.x以上的版本,eureka依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
装う-たartifactIdの変更:
1.5.7的版本中,feign依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> 2.x以上的版本,feign依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
MyBatisのは、リソースを参照してください、springbootバージョンのMyBatisの-springboot-ステーターのバージョンとの対応をアップグレード頼るMyBatisの-springboot-スターター公式文書を
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
、IDEAのmaven-を変更した後>依存関係を表示するには、もともとのパッケージの「不明」バージョンとして正しいバージョンとして表示されます。
第五に、設定ファイルのアップグレード
次に、あなたがIDEAで設定ファイルを開いたとき、あなたはいくつかの構成が示されているように、あなたはすぐにIDEAでき赤い波線が表示されます見つけることができます元の設定の多くspringboot-2.xは放棄された設定ファイルを変更します再びIDEAを使用することを推奨する理由で修理(ショートカットのAlt + Enter)を補正、。それとも、記事に応じて変更することができ、構成表をまとめたもので、必ずしもすべてではありません。
-
Webパーツ:
古いプロパティ 新しいプロパティ リマーク server.contextパス server.servlet.contextパス プロジェクトのアクセス・パス server.context-parameters.* server.servlet.context-parameters.* ServletContext初始化参数 spring.http.multipart.maxFileSize spring.servlet.multipart.max-file-size 限定单个文件上传大小的上限 spring.http.multipart.maxRequestSize spring.servlet.multipart.max-request-size 限定单次请求文件大小的上限 -
actuator部分:
old property new property remark management.context-path management.server.servlet.context-path actuator暴露接口的前缀 management.security.enabled actuator是否需要安全保证 management.port management.server.port actuator暴露的端口 endpoints.key.enabled management.endpoint.key.enabled 配置指定actuatorEndpoint management.endpoints.web.exposure.include=* 暴露所有端点 endpoints.health.sensitive actuator的health接口是否需要安全保证 -
security部分:
old property new property remark security.user.name spring.security.user.name username security.user.password spring.security.user.password password security.basic.path (通过代码配置) security.basic.enabled (通过代码配置) -
redis部分:
old property new property remark spring.redis.pool.max-active spring.redis.jedis.pool.max-active 最大活动连接数量 spring.redis.pool.max-wait spring.redis.jedis.pool.max-wait 最大阻塞等待时间 spring.redis.pool.max-idle spring.redis.jedis.pool.max-idle 最大空闲连接数量 spring.redis.pool.min-idle spring.redis.jedis.pool.min-idle 最小空闲连接数量 -
quartz部分:
old property new property remark -
datasource部分:
old property new property remark spring.datasource.driverClassName spring.datasource.driver-class-name spring.datasource.url spring.datasource.jdbc-url 多数据源 spring.datasource.url spring.datasource.url 单数据源 注意: 在新版本中,MySQL的驱动类名也变了,启动一个带有数据源的项目后,您将在控制台中看到如下日志信息:
Loading class ‘com.mysql.jdbc.Driver’. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
-
eureka部分:
old property new property remark spring.cloud.client.ipAddress spring.cloud.client.ip-address eureka客户端的ip地址
六、代码层的修改
类所属的包名的改变
新版本中有一些类的包名更改了,例如DataSourceBuilder类:该类原有的包路径为
// 1.5.7版本中的路径
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
// 2.x版本中的路径
import org.springframework.boot.jdbc.DataSourceBuilder;
对于此类问题有很多,修改起来也比较简单,您可以使用IDEA自动修复工具进行包的改变,您只需要删除错误的import语句,IDEA会为您自动导包。
项目启动报错
接下来将解决一个比较棘手的问题:在本人升级的项目中使用了Spring4.x具有的guava cache,但是该组件在Spring 5中废除,取而代之的是caffeine。这意味着程序将不能再使用guava cache,尝试降低spring-context-support.jar的版本也是不行的。项目启动报错如图:
对使用guava cache的工程进行代码修改,将缓存策略修改为caffeine。原有的guava缓存策略代码如下:
public GuavaCacheManager guavaCacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
//规定了缓存在1小时没有使用的情况下进行回收
//规定了缓存的最大容量
cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).maximumSize(100000));
ArrayList<String> cacheNames = new ArrayList<>();
cacheNames.add("common-cache-guava-caching");
cacheManager.setCacheNames(cacheNames);
return cacheManager;
}
使用springboot-caffeine的代码如下,配置与使用guava cache是等同的。有关于caffeine更多的配置或详细信息,请参考caffeine官方文档
public CaffeineCacheManager guavaCacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
Caffeine caffeine = Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(100000)
.expireAfterWrite(1, TimeUnit.HOURS);
cacheManager.setCaffeine(caffeine);
ArrayList<String> cacheNames = new ArrayList<>();
cacheNames.add("common-cache-guava-caching");
cacheManager.setCacheNames(cacheNames);
return cacheManager;
}
springboot-2.x中redis的相关代码也需要修改,原有的代码如下:
public RedisCacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
//过期时间单位毫秒
redisCacheManager.setDefaultExpiration(72000);
redisCacheManager.setUsePrefix(true);
redisCacheManager.setCachePrefix(new DefaultRedisCachePrefix());
ArrayList<String> cacheNames = new ArrayList<>();
cacheNames.add("common-cache-redis-caching");
}
升级后的RedisCacheManager
删除了这个构造方法,修改代码如下所示,有关redis的最新使用方法请参考官方文档:Spring Data Redis官方文档
public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config.entryTtl(Duration.ofMillis(72000));
Set<String> cacheNames = new HashSet<>();
cacheNames.add("common-cache-redis-caching");
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("common-cache-redis-caching", config);
RedisCacheManager cacheManager = RedisCacheManager.builder(redisTemplate.getConnectionFactory())
.initialCacheNames(cacheNames)
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
由devtools引发的类转换异常
在解决了代码编译问题之后,启动项目在运行时发现报错,大致归为ClassCastException: A cannot be cast to A
的问题,明明是同一个类,但是在A aa = (A) obj;
的时候发生异常。
在百度和查阅文档之后,发现是因为devtools造成的。devtools重新启动功能通过使用两个类加载器来实现,默认情况下,IDE加载的文件以 “restart” classloader加载,而任何以.jar
结尾的文件将以“base” classloader加载。本人涂着省事的目的直接禁用了devtools依赖。以下是官方文档的说明已经解决问题的办法,您可以在META-INF/spring-devtools.properties
文件中加入一些内容。更多详情参见spring-boot-devtools官方文档
前端request请求404
再次启动项目后,发现前端请求后台的接口有很多都是404,进一步发现这些请求都是xxx.do
的方式,您可以进行如下配置:spring.mvc.pathmatch.use-suffix-pattern=true
,建议新创建的项目不要使用.do或.action结尾的请求。具体原因参考springboot官方文档
前端request请求406
再次启动项目后,发现前端请求后台的接口存在部分406,另外在控制台中有Could not find acceptable representation
报错。请您修改application启动类代码,继承WebMvcConfigurationSupport
,并重新配置消息转化类和新增ResourceHandler,代码如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MmsOperateApplication extends WebMvcConfigurationSupport {
public static void main(String[] args) {
SpringApplication.run (MmsOperateApplication.class, args);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1、定义一个convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastjson的配置信息
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
//4、将convert添加到converters中
converters.add(fastConverter);
//5、追加默认转换器
super.addDefaultHttpMessageConverters(converters);
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/index.html")
.addResourceLocations("classpath:static/index.html");
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
}
}
在修改完毕后,本人所升级的项目已能够正常启动。关于更多的问题或配置将在以后的日子里进行更新。
参考资料
[1] 1.5用の起動から春のアップグレード
[2] springboot springcloudと対応するバージョンについて説明
[3] 春Redisの文献
[4] springcloud文書
[5] カフェイン公式文書
[6] MyBatisの-springboot-公文書スターター