引言

在Java的发展历程中,Java 17是一个重要的里程碑,作为长期支持(LTS)版本,它带来了许多新特性和性能改进。然而,从Java 1.8直接升级到Java 17并不是一件简单的事情,过程中可能会遇到各种兼容性问题和意想不到的坑。本文将记录在升级过程中遇到的一些常见问题及其解决方案。

1. maven编译报错

错误提示 无效的目标发行版: 17 具体原因截图如下

 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project work-order-common: Fatal error compiling: 无效的目标发行版: 17 -> [Help 1]

解决
1。配置jdk17 环境变量
2。升级maven版本 建议3.8以上
3。项目设置 确保为 jdk17
在这里插入图片描述

4。jave compiler 版本 确认为17
在这里插入图片描述

2、lombok 编译报错

java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x690e4b00) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x690e4b00

原因:JDK版本太高,lombok版本太低。
解决方法:升级lombok版本从1.18.12到1.18.28(最新版本)

3. 项目启动报错


***************************
APPLICATION FAILED TO START
***************************

Description:

No spring.config.import property has been defined

Action:

Add a spring.config.import=nacos: property to your configuration.
	If configuration is not required add spring.config.import=optional:nacos: instead.
	To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.

Disconnected from the target VM, address: '127.0.0.1:50241', transport: 'socket'

Process finished with exit code 1

由于项目中使用springcloud alibaba 组件 nacos 需要在bootstrap文件中优先加载
Spring Cloud 新版本默认将 Bootstrap 禁用,需要将 spring-cloud-starter-bootstrap 依赖引入到工程中:

 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
 </dependency>

4. spring cloud commons 中 okhttp报错

2023-06-09 17:06:03.714 ERROR [main] [,,,] org.springframework.boot.SpringApplication.reportFailure - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'okHttpClientBuilder' defined in class path resource [org/springframework/cloud/commons/httpclient/HttpClientConfiguration$OkHttpClientConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [okhttp3.OkHttpClient$Builder]: Factory method 'okHttpClientBuilder' threw exception; nested exception is java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:141)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:90)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [okhttp3.OkHttpClient$Builder]: Factory method 'okHttpClientBuilder' threw exception; nested exception is java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
	... 45 common frames omitted
Caused by: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
	at okio.Buffer.write(Buffer.kt)
	at okhttp3.ResponseBody.create(ResponseBody.java:214)
	at okhttp3.internal.Util.<clinit>(Util.java:69)
	at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:124)
	at okhttp3.OkHttpClient$Builder.<init>(OkHttpClient.java:449)
	at org.springframework.cloud.commons.httpclient.HttpClientConfiguration$OkHttpClientConfiguration.okHttpClientBuilder(HttpClientConfiguration.java:74)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	... 46 common frames omitted
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)

Caused by: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
	at okio.Buffer.write(Buffer.kt)
	at okhttp3.ResponseBody.create(ResponseBody.java:214)
	at okhttp3.internal.Util.<clinit>(Util.java:69)
	at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:124)
	at okhttp3.OkHttpClient$Builder.<init>(OkHttpClient.java:449)
	at org.springframework.cloud.commons.httpclient.HttpClientConfiguration$OkHttpClientConfiguration.okHttpClientBuilder(HttpClientConfiguration.java:74)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	... 46 common frames omitted

解决办法

  1. 引入对应的kotlin依赖
<!--  jetbrains kotlin支持     -->
<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib</artifactId>
    <version>1.8.10</version>
</dependency>

这种办法也不是最完美的 idea中会有提示 You have kotlin-stdlib configured but no corresponding plugin execution
大概意思就是 依赖中配置了 kotlin-stdlib 但是未配置插件 为了避免这个提示 可以添加插件
注意 ${Kotlin version} 替换为对应的版本

<plugins>
    <!-- Other plugins -->
    <plugin>
       <groupId>org.jetbrains.kotlin</groupId>
       <artifactId>kotlin-maven-plugin</artifactId>
       <version>${Kotlin version}</version>
       <executions>
           <execution>
               <id>compile</id>
               <phase>process-sources</phase>
               <goals>
                   <goal>compile</goal>
               </goals>
               <configuration>
                   <sourceDirs>
                       <source>target/generated-sources/annotations</source>
                       <source>src/main/java</source>
                   </sourceDirs>
               </configuration>
           </execution>
           <execution>
               <id>test-compile</id>
               <goals>
                   <goal>test-compile</goal>
               </goals>
           </execution>
       </executions>
   </plugin>
</plugins>

  1. 配置中关闭 okHttp (有风险)
#关闭掉commons自带的okHttp
spring.cloud.httpclientfactories.ok.enabled=false

--------------------------------------------------持续更新-------------------------------------------------------------


good day!!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐