Eclipse(STS)在spring文件中表示不支持major.minor 52.0,但I';我正在使用Java8

Eclipse(STS)在spring文件中表示不支持major.minor 52.0,但I';我正在使用Java8,java,eclipse,spring,maven,spring-tool-suite,Java,Eclipse,Spring,Maven,Spring Tool Suite,在我的applicationContext.xml文件中,我有这个错误 处理XML“foo/bar/annotations/SomeAnnotation:不支持的主版本52.0”时出错。有关详细信息,请参阅错误日志 在这条线上 <context:component-scan base-package="foo.bar" /> 请检查eclipse中已安装的JRE,以及哪一个设置为默认 请检查eclipse中已安装的JRE,以及哪个JRE设置为默认值 看起来您是在比1.8更旧的JDK

在我的
applicationContext.xml
文件中,我有这个错误

处理XML“foo/bar/annotations/SomeAnnotation:不支持的主版本52.0”时出错。有关详细信息,请参阅错误日志

在这条线上

<context:component-scan base-package="foo.bar" />

请检查eclipse中已安装的JRE,以及哪一个设置为默认


请检查eclipse中已安装的JRE,以及哪个JRE设置为默认值


看起来您是在比1.8更旧的JDK或JRE上运行STS本身。由于Spring支持需要某种类型的类加载和类分析,因此,如果它本身使用JDK7或以前的版本运行,它就无法对项目的Java8编译类执行这种操作。

看起来您是在旧的JDK或JRE上运行STS,而不是1.8。由于后台的Spring支持需要某种类型的类加载和类分析,因此,如果它本身使用JDK7或以前的版本运行,它就无法对项目的Java8编译类进行此类加载和分析。

首先,堆栈跟踪的第一个条目指向方法
java.lang.ClassLoader.defineClass1
,这是一个调用JVM特定类加载机制的
本机方法。如果此方法由于不支持的类版本号而失败,则您正在无法加载此类类的JVM上运行,并且任何运行时选项都无法更改此情况

为了验证版本,我从堆栈跟踪中选取了以下行:

at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
这表明在JRE源代码中,
ThreadPoolExecutor.java
的第1145行必须位于方法
runWorker
内,并保存对任务的
run
方法的调用

检查的源代码,甚至我们发现第1145行在方法
runWorker
之外,但我们找到了一个匹配项,第1145行在
runWorker
之内,并带有对任务的
run()
方法的调用。因此,我们可以得出结论,这段代码不是在Java 6下运行的,它是在比
7-b147更新的Java 7实现中运行的,并且不能加载Java 8类

另外一个指标是,
ThreadPoolExecutor.java
的实现在Java8和java中再次发生了变化


既然您知道这段失败的代码既不是在旧的Java 6上运行,也不是在新安装的Java 8上运行,而是在您的系统中的某个地方运行的Java 7实现,那么您可以搜索它的来源以及如何替换它……

首先,堆栈跟踪的第一个条目指向方法
java.lang.ClassLoader.defineClass1
,这是一个调用JVM特定类加载机制的
本机方法。如果此方法由于不支持的类版本号而失败,则您正在无法加载此类类的JVM上运行,并且任何运行时选项都无法更改此情况

为了验证版本,我从堆栈跟踪中选取了以下行:

at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
这表明在JRE源代码中,
ThreadPoolExecutor.java
的第1145行必须位于方法
runWorker
内,并保存对任务的
run
方法的调用

检查的源代码,甚至我们发现第1145行在方法
runWorker
之外,但我们找到了一个匹配项,第1145行在
runWorker
之内,并带有对任务的
run()
方法的调用。因此,我们可以得出结论,这段代码不是在Java 6下运行的,它是在比
7-b147更新的Java 7实现中运行的,并且不能加载Java 8类

另外一个指标是,
ThreadPoolExecutor.java
的实现在Java8和java中再次发生了变化


既然您知道这段失败的代码既不是在旧的Java 6上运行,也不是在新安装的Java 8上运行,而是在您的系统中的某个地方运行的Java 7实现,那么您可以搜索它的来源以及如何替换它…

正如Martin和其他一些人已经诊断的那样,问题不在于您的工作区JRE指向什么,而在于您正在Java 7 JVM上运行STS本身。由于STS为您的项目创建其“beans模型”的方式,来自项目类路径的类由STS进行类加载,因此,如果这些类是为Java 1.8编译的,那么在JVM 1.7上运行时,STS就不能这样做

然而,其他答案都没有提到的是,如何确保STS在您想要的JVM上运行。以下是如何:

打开STS.ini文件,它应该位于用于启动STS的STS.exe旁边。在文件前面添加(或更改,如果已经存在)两行,如下所示:

-vm
...path the javaw.exe of the JVM you want to use...
重要的是,这两个参数在不同的行上。


如果您不使用这个参数,那么eclipse启动器将尝试自己寻找JVM,而它是如何做到这一点的,这有点“暗魔法”。因此,如果需要在特定VM上运行STS,最好在.ini文件中显式设置它。

正如Martin和其他一些人已经诊断的那样,问题不在于您的工作区JRE指向什么,而在于您正在Java 7 JVM上运行STS本身。由于STS为您的项目创建其“beans模型”的方式,来自项目类路径的类由STS进行类加载,因此,如果这些类是为Java 1.8编译的,那么在JVM 1.7上运行时,STS就不能这样做

然而,其他答案都没有提到的是,如何确保STS在您想要的JVM上运行。以下是如何:

打开STS.ini文件,它应该位于用于启动STS的STS.exe旁边。在文件前面添加(或更改,如果已经存在)两行,如下所示:

-vm
...path the javaw.exe of the JVM you want to use...
重要的是这两个参数是分开的