关于将VSCode的Java项目从Java8迁移到Java11的故事
首先
我正在使用Visual Studio Code(以下简称VSCode)开发Spring Boot项目。
我开始使用Java8进行开发和执行,经过一些波折,我转移到Java11上。
这句话可以翻译为:这个消息可以追溯到两年前来自微软的公告。
微软宣布从现在开始使用VSCode开发Java需要JDK11。
需要 JDK11 或更高版本来运行 VSCode 扩展功能“Language Support for Java”的新版本,
每次启动 VSCode 时都会显示要求 Java 11 或更高版本的警告。
Java 11 or more recent is required to run. Please download and install a recent JDK
考虑到Java迁移成本,选择维持现状。
我根据以下redhat-developer的vscode-java问题作为依据:
由于实在舍不得放弃VSCode开发环境,所以我决定继续使用下去。
-
- VSCodeのJavaプロジェクトでJDK8を使いつづける(Java11警告を無視)
-
- Java関連のVSCode拡張機能は古いバージョンを指定して使用
- 例:
Language Support for Java(TM) by Red Hat v0.64.1
Debugger for Java v0.20.0
Extension Pack for Java v0.9.0
Spring Boot Tools v1.20.0
Spring Boot Extension Pack v0.0.8
Lombok Annotations Support for VS Code v1.0.1
VSCode 的 settings.json 示例:
"java.jdk.ls.java.home": "C:\\Program Files\\RedHat\\java-1.8.0-openjdk-1.8.0.322-2",
"java.configuration.runtimes": [
{
"default": true,
"name": "JavaSE-1.8",
"path": "C:\\Program Files\\RedHat\\java-1.8.0-openjdk-1.8.0.322-2"
},
],
"spring-boot.ls.java.home": "C:\\Program Files\\RedHat\\java-1.8.0-openjdk-1.8.0.322-2",
有一天,重要的VSCode调试功能无法使用。
经过调查,导致Lombok的VSCode扩展自动更新是造成此问题的原因。
Lombok是一个通过注解自动生成类功能,例如setter、getter和构造函数等的库。
在Spring Boot项目中,我们使用Lombok添加了注解。但是由于Lombok版本与VSCode扩展插件不一致,导致调试功能失效。
我們在專案中指定了Lombok的新版本,雖然可以進行調試,但是多餘的調查花費了很多時間,導致開發進度延遲了。
我对继续使用旧版本的VSCode扩展功能所带来的风险有了强烈的体会。
作为临时策略,尝试使用VSCode编译器和JDK11版本,同时项目使用JDK8版本。
由於我想要使用最新版本的VSCode擴展功能,所以我決定只在VSCode上使用JDK11。我的理由是參考來自redhat-developer的vscode-java下的以下問題。
VS Code的settings.json示例:
"java.jdk.ls.java.home": "C:\\Program Files\\Amazon Corretto\\jdk11.0.16_9",
"java.configuration.runtimes": [
{
"default": true,
"name": "JavaSE-1.8",
"path": "C:\\Program Files\\RedHat\\java-1.8.0-openjdk-1.8.0.322-2"
},
],
"spring-boot.ls.java.home": "C:\\Program Files\\RedHat\\java-1.8.0-openjdk-1.8.0.322-2",
由于VSCode拓展和项目的Spring Boot版本不匹配,发现无法使用VSCode的调试功能,因此不幸被拒绝。
最终,项目方也决定升级到JDK11的版本。
我們參考了Oracle的手冊來進行從Java8到Java11的遷移。
Java项目可以通过几乎只修改pom.xml文件来从Java8迁移到Java11。
VSCode开发环境可以更新所有扩展插件至最新版本,同时也可以正常进行调试。
Spring Boot项目的pom.xml中需要修改的地方(仅供参考)
将spring-boot-starter-parent的版本更改为2.3.4.RELEASE。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
将java.version更改为11
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<jjwt.version>0.9.0</jjwt.version>
</properties>
在dependencies中添加以下内容
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.23.1-GA</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180725.0427</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.Final</version>
</dependency>
在插件中添加以下内容
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<argLine>
--illegal-access=permit
</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<argLine>
--illegal-access=permit
</argLine>
</configuration>
</plugin>
<plugin>
最后
我在VSCode开发环境中将Java项目从Java8迁移到Java11的经历。
希望对考虑将遗留系统迁移到Java的人有所帮助。