异常解决java: 无法访问org.springframework.boot.SpringApplication的解决方案

Posted No8g攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常解决java: 无法访问org.springframework.boot.SpringApplication的解决方案相关的知识,希望对你有一定的参考价值。

本文目录

一、背景描述

二、报错原因

三、解决方案


一、背景描述

Spring官网:Spring | Home

通过Spring官网初始化一个新的SpringBoot项目,如下图所示。

关键信息:maven项目,Java语言,SpringBoot版本号,项目信息,打包方式,Java版本,然后点击下边最左侧的 GENERATE CTRL + 回车,即可生成一个SpringBoot项目。

下载后使用IDEA打开,将maven依赖下载好,JDK版本选择Java8(本地电脑只有一个Java1.8),没有报错,启动项目后,结果启动失败,报错信息如下:

java: 无法访问org.springframework.boot.SpringApplication
  错误的类文件: /D:/Repository/org/springframework/boot/spring-boot/3.0.5/spring-boot-3.0.5.jar!/org/springframework/boot/SpringApplication.class
    类文件具有错误的版本 61.0, 应为 52.0
    请删除该文件或确保该文件位于正确的类路径子目录中。

理论上来说,从Spring官网初始化的一个项目,没有添加任何代码,不应该报错。但是,实际上很莫名其妙的出现报错信息。

二、报错原因

报错信息里所说的类文件版本指的是java class file version,java类文件版本。其实这个该版本号与jdk版本号是存在对应关系,具体来说61.0对应jdk17,52.0对应jdk8。
完整对应关系参见:https://stackoverflow.com/questions/9170832/list-of-java-class-file-format-major-version-numbers ,访问可能会比较慢,我已经截图了,看下图即可。

 出现上述错误主要是类文件版本与JDK版本号不对应导致的。解决这个问题很简单,把两者的关系对应上即可。

三、解决方案

两种方案:一是降低类文件版本号(即降低SpringBoot版本号),二是提升JDK版本号

拿我自己初始化的这个SpringBoot项目来说,我选择的SpringBoot版本3.0.5,该版本的SpringBoot所需的JDK版本是JDK17,而我本地电脑只安装了一个JDK8的运行环境,所以才会报这个错误。

从Spring官网查看SpringBoot版本号,查看地址:https://spring.io/projects/spring-boot#support ,降低版本号后项目正常启动成功。我选择的是 2.1.5.RELEASE。

完结!

无法创建 tempDir,java.io.tmpdir 设置为 C:\Windows\

【中文标题】无法创建 tempDir,java.io.tmpdir 设置为 C:\\Windows\\【英文标题】:Unable to create tempDir, java.io.tmpdir is set to C:\Windows\无法创建 tempDir,java.io.tmpdir 设置为 C:\Windows\ 【发布时间】:2018-11-09 08:38:58 【问题描述】:

我正在使用带有嵌入式 tomcat 的 Spring Boot,一切正常,但突然出现错误:

Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to create tempDir. java.io.tmpdir is set to C:\Windows\
    at org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory.createTempDir(AbstractEmbeddedServletContainerFactory.java:183)
    at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:165)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
    ... 11 common frames omitted
Caused by: java.io.IOException: Access is denied
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createTempFile(File.java:2024)
    at java.io.File.createTempFile(File.java:2070)
    at org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory.createTempDir(AbstractEmbeddedServletContainerFactory.java:174)
    ... 14 common frames omitted

我没有对用户或系统变量进行任何操作。

我的 TEMP user 变量正在查看 C:/Users/me/AppData/Local/Temp ,我猜 tomcat 必须使用系统一的这个值,其实就是C:/Windows/Temp

【问题讨论】:

【参考方案1】:

如果您使用 IDEA,请在“运行/调试配置”的“环境变量”窗口中选中“包含父环境变量”。

【讨论】:

【参考方案2】:

在 Windows 上,GetTempPathA 用于定位临时目录。算法:

1. The path specified by the TMP environment variable.
2. The path specified by the TEMP environment variable.
3. The path specified by the USERPROFILE environment variable.
4. The Windows directory.

因此,如果您的应用在未定义 TMP & TEMP & USERPROFILE 的情况下启动,您将得到 java.io.tmpdir == GetWindowsDirectoryA。

通常应用程序将java.io.tmpdir 设置在app-run.bat 内(通过-D...=...)或app.properties

我遇到了这个问题,因为如果 environment 属性没有被传递而是被替换,Gradle Test 任务将不会传递环境变量:

test 
    environment = ["A": "1", "B": "2"] // won't work, because it replaces envs


test 
    environment( ["A": "1", "B": "2"] ) // will work, because it appends to existing envs

【讨论】:

啊,这就解释了。在某些时候,我必须将我的 Eclipse 启动配置从“附加环境...”切换到“替换环境...”,并删除这些变量。 (我认为我的应用程序过去是这样工作的,但也许 JDK 8 -> 11 或 Windows 7 -> 10 可能改变了什么?)【参考方案3】:

我观察到以下行为

突然变了 如果从命令行作为独立 jar 运行,则可以工作 从 IntelliJ (2018.1) 运行时失败

作为一种快速解决方法,我在运行配置中明确添加了-Djava.io.tmpdir=$EXISING_DIR_WITH_WRITE_ACCESS 作为 JVM 参数。

【讨论】:

是的,它解决了问题,但更多的是关于解决方法,无论如何标记为已解决,谢谢【参考方案4】:

如果您使用 Eclipse,请在“运行/调试配置”的“环境变量”窗口中选中“附加到环境变量”。

感谢@max 上面的回答

我使用的是 JAVA EE eclipse - photon

【讨论】:

【参考方案5】:

就我而言,当我将默认工作区库从 [jre.1.8.0_121] 更改为 [jdk.1.8.0_121] 时,出现了问题。将其设置回 jre 似乎已经解决了问题。

【讨论】:

以上是关于异常解决java: 无法访问org.springframework.boot.SpringApplication的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Java异常处理

Java异常

Java8:异常处理

java_8 异常处理

java异常处理

Spring Data Jpa Repository 未将实体保存到数据库