对于依赖版本,不可以直接出现 RELEASE,你可以定义一个 properties 然后引用一下
org.springframework.boot spring-boot-starter-test RELEASE test
##### 一些依赖的版本升级
这部分只列举我再升级过程中遇到的需要升级的问题
**升级 lombok 到 1.18.26**
lombok 得用新版本 我之前是 1.18.4 现在换到 26
org.projectlombok lombok 1.18.26
**升级 springboot 到 2.7.14**
你可以在官方文档看到 2.7.14 对应的一些依赖版本
https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/dependency-versions.html#appendix.dependency-versions
<spring.boot.version>2.7.14</spring.boot.version>
<spring.version>5.3.29</spring.version>
<dubbo.version>2.7.23</dubbo.version>
说一下我这里为什么没有选择拥抱 3.x ,因为 dubbo 3 才支持 springboot 3.x 和 spring6.x,而我调用的三方接口都是 dubbo2,dubbo3 应用基本注册不向下兼容 dubbo2,会有诸多问题,所以这里选择
2.7.14 GA 这个官网稳定支持的版本,如果你没有这个问题,可以选择拥抱 3.0
提醒一下如果要升级 springboot3
springboot3 弃用了 javax.servlet.http.HttpServletRequest; 需要替换为 jakarta.servlet.http.HttpServletRequest;
HandlerInterceptorAdapter 被删除了,由 HandlerInterceptor 来代替
yml 配置允许循环依赖
spring:
main:
allow-circular-references: true
#####
**三方包依赖找不到类**
我引入的三方包,Spring bean 加载存在问题,感觉是 JDK 升级的问题,跟 spring 的升级没关系
是找不到这个玩意的定义 org.apache.commons.configuration.interpol.ConfigurationInterpolator
nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.configuration.interpol.ConfigurationInterpolator
很怪,明明有就找不到,这里将三方包的引入排除掉,自己项目中单独进行引入
commons-configuration commons-configuration commons-configuration commons-configuration 1.10
顺便提一个 springbean 加载的问题,如果你引入的三方包有路径下的 bean 需要你进行注册管理,你项目启动类的扫描路径下需要包含他的路径,比如
@SpringBootApplication(scanBasePackages = {“com.你的包”,“com.三方的需要扫描的包路径”})
当然,如果路径一致,就一个就可以
**zookeeper 升级 3.5.10**
升级 zookeeper 版本为 3.5.10 , 3.5.x 以下不兼容 JDK17
https://curator.apache.org/zk-compatibility-34.html 还有个 curator 强依赖的场景需要注意升级
如果你服务器的 zookeeper 可以升级最好不过,如果不能
curator 2.x 可以兼容 zookeeper 3.5.x 的版本
如果你之前使用的是 curator 2.x 就只升级 zookeeper 的版本就行了,这样连接你线上的 zookeeper 不会有问题。
否则请将服务器版本同步升级
可参考文章:
官方文章 https://curator.apache.org/zk-compatibility-34.html
csdn 文章 https://blog.csdn.net/wo541075754/article/details/69138878
<apache-curator.version>2.12.0</apache-curator.version>
org.apache.curator
curator-framework
a
p
a
c
h
e
−
c
u
r
a
t
o
r
.
v
e
r
s
i
o
n
<
/
v
e
r
s
i
o
n
>
<
e
x
c
l
u
s
i
o
n
s
>
<
e
x
c
l
u
s
i
o
n
>
<
g
r
o
u
p
I
d
>
l
o
g
4
j
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
l
o
g
4
j
<
/
a
r
t
i
f
a
c
t
I
d
>
<
/
e
x
c
l
u
s
i
o
n
>
<
e
x
c
l
u
s
i
o
n
>
<
g
r
o
u
p
I
d
>
o
r
g
.
a
p
a
c
h
e
.
z
o
o
k
e
e
p
e
r
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
z
o
o
k
e
e
p
e
r
<
/
a
r
t
i
f
a
c
t
I
d
>
<
/
e
x
c
l
u
s
i
o
n
>
<
/
e
x
c
l
u
s
i
o
n
s
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
o
r
g
.
a
p
a
c
h
e
.
c
u
r
a
t
o
r
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
c
u
r
a
t
o
r
−
r
e
c
i
p
e
s
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
{apache-curator.version}</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>
apache−curator.version</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator−recipes</artifactId><version>{apache-curator.version}
log4j
log4j
org.apache.zookeeper
zookeeper
**mysql 版本升级 8.0.33**
没啥好说的,不升你连不上
mysql mysql-connector-java 8.0.33
##### 启动项
注意你项目启动时需要增加启动参数,不管是实际运行还是本地调试运行
–add-opens
java.base/java.lang=ALL-UNNAMED
–add-opens
java.base/java.io=ALL-UNNAMED
–add-opens
java.base/java.math=ALL-UNNAMED
–add-opens
java.base/java.net=ALL-UNNAMED
–add-opens
java.base/java.nio=ALL-UNNAMED
–add-opens
java.base/java.security=ALL-UNNAMED
–add-opens
java.base/java.text=ALL-UNNAMED
–add-opens
java.base/java.time=ALL-UNNAMED
–add-opens
java.base/java.util=ALL-UNNAMED
–add-opens
java.base/JDK.internal.access=ALL-UNNAMED
–add-opens
java.base/JDK.internal.misc=ALL-UNNAMED
当然你如果不加也能起可以不加。解释一下
`--add-opens` 参数是在 JDK 9 及更高版本中引入的,用于在模块系统中打开特定的包以实现反射访问。模块系统引入了更严格的访问控制,以确保代码的可靠性和安全性。在某些情况下,一些库或框架可能依赖于 JDK 内部的类和方法,这些类和方法在模块系统中是受限的,因此需要通过 `--add-opens` 参数进行显式打开。
具体来说,`--add-opens` 参数允许你在指定的模块中打开某个包,以便其他模块可以通过反射访问该包中的类和方法。`java.base` 是 JDK 的基础模块,其中包含了 Java 核心类库。使用 `--add-opens java.base/java.lang=ALL-UNNAMED` 参数是为了在 JDK 9 及更高版本中允许在 `java.base` 模块中的 `java.lang` 包中打开所有未命名的类,从而允许反射访问。
通常情况下,如果你的应用代码遵循良好的编程实践,是不需要使用 `--add-opens` 参数的。然而,一些第三方库、框架或老旧的代码可能会依赖于 JDK 内部的特性,这时可能会需要使用这个参数来解决访问限制问题。不过,尽量避免在生产环境中过度依赖这种方式,因为这可能会引入一些潜在的风险和不稳定性。
比如
import sun.misc.Unsafe;
public class RestrictedAccessExample {
public static void main(String[] args) {
try {
// 使用反射获取 Unsafe 类的实例
Class<?> unsafeClass = Class.forName(“sun.misc.Unsafe”);
Unsafe unsafe = (Unsafe) unsafeClass.getDeclaredField(“theUnsafe”).get(null);
// 使用 Unsafe 实例调用内部方法
long value = 42;
long address = unsafe.allocateMemory(8);
unsafe.putLong(address, value);
System.out.println("Value at address: " + unsafe.getLong(address));
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
14413046946)]
[外链图片转存中…(img-AIYcnMNy-1714413046947)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!