我们可以重写org.springframework.core.JdkVersion并加载这个类而不是Spring附带的默



是否可以覆盖来自Spring等外部库的类的默认行为,并让类加载器加载自定义实现而不是默认实现。

我们看到下面的错误,因为我们的Spring是2.5.6,JDK是8。由于时间限制,我们没有考虑升级Spring,而是考虑是否可以破解org.springframework.core.JdkVersion.

"Caused by: java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher"

Spring 2.5.6中JdkVersion的默认实现仅支持1.5、1.6和1.7。

我们还尝试了其他选项来覆盖java.version系统属性。选项A(在启动tomcat实例时,我们传递了-Djava.version=1.7.0,但它仍然返回1.8.0。选项B(我们在ContextListener类中用程序设置了java版本,但在创建web上下文之前就抛出了异常。

因此,我们正在考虑的选项是编写自定义JdkVersion,并以某种方式加载它,而不是Spring上下文库附带的JdkVersion。

这个选项可能吗?或者任何其他可以尝试的方法,而无需升级spring,也无需将整个spring库添加到源代码和构建中

感谢

我们认为的另一个选择是

是的,用自定义版本替换JdkVersion可以工作。如果要这样做,干净的方法是下载相关的Spring源代码,进行更改,构建它,并使用生成的工件而不是标准工件。

我不会说它工作:

  1. Spring的人不推荐它,而且显然不打算支持它https://github.com/spring-projects/spring-framework/issues/16518.
  2. 你实际上并没有清楚地解释你试图通过这样做来实现什么。所以我/我们不明白";它行得通吗"实际上是指

IMO,最好升级应用程序的Spring依赖关系。弹簧2.5.6非常古老;生命的终结";。此外,我非常确信,当你需要升级到Java 11时,你提出的这个破解方法不会奏效。


注意-D方法不起作用。您不能以这种方式覆盖该属性。JVM将覆盖您的覆盖。并且以编程方式设置属性。。。足够早了。。。这将是困难的。

相关内容

最新更新