Eclipse (STS) 在 spring 文件中说 major.minor 52.0 不受支持,但我使用的是 Java 8

Eclipse (STS) says unsupported major.minor 52.0 in spring file, but I'm using Java 8

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

Error occured processing XML 'foo/bar/annotations/SomeAnnotation : Unsupported major.minor version 52.0'. See Error Log for more details

这条线

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

我的 STS 设置为使用 Java 1.8 作为默认 JRE,这个项目在其 Java 构建路径上有 1.8 JRE,我的 JAVA_HOME 指向 jdk 1.8,我将 maven-compiler-plugin 设置为使用源和目标 1.8。

spring 插件是否以某种方式使用 1.6?在此之前我使用的是 1.6,是否缺少某些设置?


更新 2: 我忘了 52 意味着它是用 Java 8 编译的,我认为它意味着 7。这解释了为什么我想知道设置了什么6 而不是 7。


更新:这里是错误日志的内容。

!ENTRY org.springframework.ide.eclipse.beans.core 1 0 2015-11-24 15:11:08.176
!MESSAGE Error occured processing '/foo-engine/src/main/resources/applicationContext.xml'
!STACK 0
java.lang.UnsupportedClassVersionError: foo/bar/annotations/SomeAnnotation : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access0(URLClassLoader.java:71)
    at java.net.URLClassLoader.run(URLClassLoader.java:361)
    at java.net.URLClassLoader.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.springframework.core.type.classreading.RecursiveAnnotationAttributesVisitor.visitEnd(RecursiveAnnotationAttributesVisitor.java:47)
    at org.springframework.asm.ClassReader.readAnnotationValues(ClassReader.java:1802)
    at org.springframework.asm.ClassReader.accept(ClassReader.java:642)
    at org.springframework.asm.ClassReader.accept(ClassReader.java:508)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:64)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:98)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:279)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:248)
    at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:87)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
    at org.springframework.ide.eclipse.beans.core.internal.model.namespaces.DelegatingNamespaceHandlerResolver$ElementTrackingNamespaceHandler.parse(DelegatingNamespaceHandlerResolver.java:177)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1411)
    at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$ErrorSuppressingBeanDefinitionParserDelegate.parseCustomElement(BeansConfig.java:1428)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:168)
    at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$ToolingFriendlyBeanDefinitionDocumentReader.doRegisterBeanDefinitions(BeansConfig.java:1357)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
    at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig.registerBeanDefinitions(BeansConfig.java:410)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
    at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig.loadBeanDefinitions(BeansConfig.java:394)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig.call(BeansConfig.java:453)
    at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig.call(BeansConfig.java:1)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

!ENTRY org.springframework.ide.eclipse.core 4 2 2015-11-24 15:11:08.423
!MESSAGE Problems occurred when invoking code from plug-in: "org.springframework.ide.eclipse.core".
!STACK 0
java.lang.UnsupportedClassVersionError:foo/baz/repository/BazRepository : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access0(URLClassLoader.java:71)
    at java.net.URLClassLoader.run(URLClassLoader.java:361)
    at java.net.URLClassLoader.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at org.springframework.ide.eclipse.data.jdt.core.RepositoryInformation.<init>(RepositoryInformation.java:88)
    at org.springframework.ide.eclipse.data.internal.validation.InvalidDerivedQueryRule.supports(InvalidDerivedQueryRule.java:71)
    at org.springframework.ide.eclipse.data.internal.validation.InvalidDerivedQueryRule.supports(InvalidDerivedQueryRule.java:44)
    at org.springframework.ide.eclipse.core.model.validation.AbstractValidator$ValidationVisitor.visit(AbstractValidator.java:278)
    at org.springframework.ide.eclipse.core.model.AbstractModelElement.accept(AbstractModelElement.java:131)
    at org.springframework.ide.eclipse.core.model.validation.AbstractValidator.validate(AbstractValidator.java:142)
    at org.springframework.ide.eclipse.core.model.validation.AbstractValidator.validate(AbstractValidator.java:104)
    at org.springframework.ide.eclipse.core.internal.project.SpringProjectContributionManager.execute(SpringProjectContributionManager.java:260)
    at org.springframework.ide.eclipse.core.internal.project.SpringProjectContributionManager.run(SpringProjectContributionManager.java:291)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.springframework.ide.eclipse.core.internal.project.SpringProjectContributionManager.execute(SpringProjectContributionManager.java:294)
    at org.springframework.ide.eclipse.core.internal.project.SpringProjectContributionManager.runValidator(SpringProjectContributionManager.java:257)
    at org.springframework.ide.eclipse.core.internal.project.SpringProjectContributionManager.build(SpringProjectContributionManager.java:131)
    at org.eclipse.core.internal.events.BuildManager.run(BuildManager.java:734)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:205)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:245)
    at org.eclipse.core.internal.events.BuildManager.run(BuildManager.java:300)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:303)
    at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:359)
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:382)
    at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:144)
    at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

请检查您在 eclipse 中安装的 JRE,哪个设置为默认。

看起来您 运行 STS 本身在比 1.8 更旧的 JDK 或 JRE 上。由于引擎盖下的 Spring 支持需要某种 class 加载和 class 分析,因此它不能为您的 Java8 编译 classes 执行此操作项目,如果它本身运行 JDK7 或以前的版本。

首先,任一堆栈跟踪的第一个条目都指向方法 java.lang.ClassLoader.defineClass1,这是一个调用 JVM 特定 class 加载机制的 native 方法。如果此方法由于不受支持的 class 版本号而失败,则您在无法加载此类 classes 的 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方法的调用。

检查 6b14, 6b27 and even an earlier version of Java 7 (7-b147) we find the line 1145 being even outside the method runWorker, but with 7u40-b43 的源代码,我们找到了一个匹配项,第 1145 行在 runWorker 内,并且包含任务的 run() 方法的调用。因此,我们可以得出结论,此代码在 Java 6 下是 而不是 运行,它是 Java 7 实现中的 运行 更新比 7-b147 并且无法加载 Java 8 classes.

作为附加指标,ThreadPoolExecutor.java 的实施在 Java 8 和 the line 1145 doesn’t match the run() invocation anymore 中再次发生变化。

现在您知道这个失败代码 运行 既不在您的旧 Java 6 上,也不在新安装的 Java 8 上,而是一个 Java 7 实现一定是在你系统的某个地方,你可以搜索它来自哪里以及如何替换它......

正如 Martin 和其他一些人已经诊断出的那样,问题不在于您的工作区 JRE 指向什么,而是您在 Java 7 JVM 上 运行ning STS 本身。由于 STS 为您的项目创建其 'beans model' 的方式,来自项目类路径的 类 正在被 STS 类加载,因此当 运行ning 在 JVM 1.7 上时它不能这样做,如果类 已针对 Java 1.8.

编译

但是,其他答案中 none 提到的是如何确保 STS 运行ning 在您想要的 JVM 上。方法如下:

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

-vm
...path the javaw.exe of the JVM you want to use...

重要的是这两个参数在不同的行上。

如果您不输入此参数,则 eclipse 启动器将尝试自行查找 JVM,具体的操作方式有点 'dark magic'。因此,如果您需要在特定 VM 上使用 STS 运行,最好在 .ini 文件中明确设置它。