① idea怎么设置默认jdk版本
首先可以试试在项目管理(就是工具栏那个窗口图标)中删除无效的jdk环境, 然后设置中也有java编译器的设置,检查一下. 另外如果是maven项目, 检查maven配置文件,可以直接指定jdk版本
② IDEA和命令提示符显示jdk版本不一致
有影响,但是如果你idea设置成1.7版本的jdk,就不能使用jdk1.8新特性,否则编译无法通过最好设置成跟本地安装环境一样的jdk这样使用起来就不会有问题。
③ idea 导入模块化项目报错解决方法
使用idea导入基础庆败团的模块化项目时有的子项目会报错 一。查誉橘看报错问题:Try-with-resources are not supported at language level '1.5' jdk1.5版本不支持Try-with-resources,可是我的idea默认的jdk版本是1.8在网上查资料都是一溜烟的英文,让我很忧伤, 我的解决办法:枯仿1.每一个model的language level 改成和你安装的jdk对应的版本 2.上图中dependencies中的model的sdk改成项目的jdk版本或者改成project sdk都可以,因为pom.xml文件中配置了jdk的版本 二。启动时报错问题:这个问题代表的意思是javac编译时的target batecode version 不是上面的javac1.8 版本 解决办法:下图中target batecode version改成1.8就可以了
④ intellij idea怎么更改jdk版本
更改方法如下:
(1)单击File | Project Structure菜单项,打开ProjectStructure对话框。
(2)在左侧列表框中,选择SDKs列表项,进入回SDK配置答页面。
(3)若中间的SDK列表框没有选项,则单击“+”号创建一个JDK列表项。
(4)选择JDK列表项,在SDK ’JDK’选项卡页面中,单击JDK home path项目的浏览按钮,定位JDK安装路径并保存。
⑤ java选的jdk11为什么变成了17
Java11升级Java17备忘录困数下塘烧饼白头不厌穷编码,只影孤灯两卷书。来自专栏一只老程序猿一、概述Java17是目前Java最新的LTS版本,SpringBoot从2.5.5开始正式支持Java17,并且计划从3.0版本开始,Java版本要求最低是Java17。为了顺应Java及其生态的发展,最近对一套JavaWeb开发框架做了版本升级,主要是Java版本和Springboot版本的升级,包括:Java版本从openJDK11升级到openJDK17springboot版本从2.1.11升级到2.7.4本次升级相比从Java8升级到Java11要简单很多,基本没遇到什么问题。Java8到Java11之间有Java9这个变化很大的拦路虎,包括但不限于:移除了一些以前集成在jdk的lib中的依赖包,引入模块化导致某些内部API不可用,类加载机制变化导致一些第三方依赖包版本不兼容,等等。而从Java11到Java17,中间并没有Java9那样巨大的变化,只有谈败Java16和Java17中有一些增强Java内部封装的新特性,可能会导致底层类库依赖包的老版本不能兼容Java17。关于Java8升级Java11的工作,可以参考我以前的文章:java – Java8升级Java11备忘录_个人文章 – SegmentFault 思否另外,本篇文章主要讲如何从Java11升级到Java17,以及升级过程中遇到的一些问题。如果想看Java11到Java17有哪些新特性,可以参考我以前的另一片文章:下塘烧饼:java17相对java11的新特性二、升级工作内容升级工作内容大致如下:2.1 安装openJDK17及其对应的IDEA这里选择的是eclipse的Adoptium社区版本:OpenJDK17U-jdk_x64_linux_hotspot_17.0.3_7.tar.gz下载地址:https://adoptium.net/zh-CN/temurin/archive更多版本与下载地址请参考文章:下塘烧饼:java17相对java11的新特性安装很简单,解压缩到指定目录即可。只是开发的话,JAVA_HOME与PATH等环境变量不是一定要设置的,比如我这里的环境有多个JDK版本,只要在IDE中添加新的JDK即可。IDEA的话,使用2021.2.4以上版本即可支持Java17,在其sdk中加入刚刚安装好的JDK目录:用IDEA任意打开一个java工程,在其Project Structrue -> Platform settings -> SDKs中添加JDK17目录。2.2 配置本汪侍首地Maven在本地Maven的配置文件中添加新的JDK17的profile,比如我这里的配置文件是/opt/apache-maven-3.5.0/conf/settings.xml,打开并在其中添加:<profiles> … <profile> <id>openJDK17</id> <activation> <jdk>17</jdk> </activation> <properties> <JAVA_HOME>/usr/java/jdk-17.0.3+7/</JAVA_HOME> <JAVA_VERSION>17</JAVA_VERSION> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion> </properties> <repositories> <repository> <id>XXX-Repository</id> <name>XXX Maven Repository</name> <url>http://maven.xxx/content/groups/public/</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>XXX-Repository</id> <name>XXX Maven Repository</name> <url>http://maven.xxx/content/groups/public/</url> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles>JAVA_HOME是本地JDK安装目录。repository与pluginRepository用来配置maven仓库地址,之后在IDE中启用这里配置的profile。这样maven拉取jar包时,会优先从这里配置的maven仓库拉取,拉取不到时再去中央仓库拉。配置好settings.xml后,在各个java工程中启用新的profile:首先在File -> Settings -> Maven中确定maven及其配置文件目录:然后在IDEA的maven插件中选择jdk17的profile:2.3 修改父工程的pom版本控制升级对象是一套JavaWeb开发框架,有自己的父工程来控制依赖包的版本,在决定升级Java版本与Springboot版本后,父工程的pom文件中的相关依赖包版本需要更新。首先是父工程自己的版本需要升级,这样仍然依赖老版本父工程的java工程就不会升级相关版本,只有依赖了新版本父工程的java工程才会升级相关版本。<artifactId>parent-xxx</artifactId> <version>2.0.0</version>这里假定老版本是1.x.x,新版本是2.0.0。实际上父工程的pom是在升级过程中不断修改的,为了不影响使用该父工程的项目开发,你需要与相关开发人员约定好在升级完成后再尝试使用新版本的父工程。然后修改基本属性与spring相关依赖包的版本,篇幅原因这里只给出版本发生变化的依赖包的修改后版本号,dependency配置略过:<properties> <!– 基本属性 –> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>17</java.version> <!– spring相关版本 –> <spring-boot.version>2.7.4</spring-boot.version> <spring-boot-admin.version>2.7.4</spring-boot-admin.version> <spring-cloud.version>2021.0.4</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version> <mybatis-spring-boot-starter.version>2.2.2</mybatis-spring-boot-starter.version> <pagehelper-spring-boot-starter.version>1.4.5</pagehelper-spring-boot-starter.version> <!– 插件版本 –> <spring-boot-maven-plugin.version>2.7.4</spring-boot-maven-plugin.version> <mybatis-generator-maven-plugin.version>1.4.1</mybatis-generator-maven-plugin.version> <!– 其他依赖包版本 –> <lombok.version>1.18.24</lombok.version> </properties>升级后的测试并不充分,这里列出的发生版本变化的依赖包可能并不全面。如果在编译或运行时发现有某个依赖包报错,说某个jdk的mole因为没有导出而无法访问的错误: cannot access class xxx (in mole jdk.xxx) because mole jdk.xxx does not export xxx to xxx,那么就基本可以确定这个依赖包版本较老不兼容Java17。解决方法很简单,在当前这个时间点,基本上所有的第三方依赖包都已经有兼容Java17的较新的版本,直接去maven中央仓库找一个新版本下载,就能解决问题。比如上面的lombok版本升级到了1.18.24,就是为了解决编译时发生的上述不兼容的错误。另外,如果父工程中还约定了很多自用的通用工程的版本,那么这里需要确保这些通用工程的版本范围在新老版本中的定义没有冲突。例如老版本的父工程中定义了一些通用工程的版本:<lib-xxx.version>[1.0.0-RELEASE,2.0.0-RELEASE)</lib-xxx.version>这里的lib-xxx是这套JavaWeb开发框架中的一个通用库,在老版本的父工程中约定它的版本范围是[1.0.0-RELEASE,2.0.0-RELEASE),即从1.0.0-RELEASE(包含)到2.0.0-RELEASE(不包含)。那么新版本的父工程,对它的版本范围约定就是[2.0.0-RELEASE,3.0.0-RELEASE)。这样约定的目的是,如果有一些java工程仍然要使用老版本的父工程(假定由于种种原因,只能用Java11与Springboot2.1.x 。。。),那么它就不会依赖2.0.0-RELEASE及其以上版本的lib-xxx;而一旦依赖了新版本的父工程,就只会依赖2.0.0-RELEASE及其以上版本的lib-xxx。最后要注意,如果在老版本(这里就是Java11和Springboot2.1.11)上还有新的应用或需求变更要开发,那么需要在代码管理库中切出一个新的分支来做升级的工作,并约定好各自的版本范围,比如采用不同的主版本号。2.4 单个Java工程的版本升级在前面的2.1到2.3准备工作完成之后,就可以对java应用工程做版本升级了。首先打开一个java工程,确认maven的目录与配置文件是否正确,并将maven插件的profile选择到jdk17,这一步已在步骤2.2中示意。然后修改工程依赖的父工程版本为2.3中修改后的父工程版本。<parent> <groupId>xxx</groupId> <artifactId>parent-xxx</artifactId> <version>2.0.0</version> </parent>然后先使用maven插件刷新pom依赖,顺利的话,可以在maven插件中看到新的依赖包版本:pom依赖刷新之后,再来修改工程的idea配置中的java版本,打开Project Structrue,依次修改或确认java版本:然后我们就可以对工程进行编译,检查有没有编译错误或警告。考虑到devops的需要,你可能需要一个maven编译脚本,要注意java版本,如下所示:#!/bin/bash export JAVA_HOME=/usr/java/jdk-17.0.3+7 mvn -version mvn clean install package注意这里指定了JAVA_HOME,maven编译时会用到这个环境变量,因此指定为JDK17的安装目录。本地环境安装有多个JDK版本时要特别注意这一点。如果是springboot工程,编译成功之后就可以启动服务:#!/bin/bash JAVA_HOME=/usr/java/jdk-17.0.3+7 JAR_PATH=$(find target -name "*.jar") ${JAVA_HOME}/bin/java -jar "${JAR_PATH}"2.5 编译与运行时遇到的问题在编译工程以及启动springboot服务时,可能会遇到以下问题。2.5.1 JDK模块内API未导出问题前面说过,Java16和Java17中有一些增强Java内部封装的新特性,该特性加强了对一些以前暴露出来但其实很不安全的关键API的封装,即你不再能从外部访问这些内部API。而java的生态圈中有很多底层的类库比如lombok在以前的版本中会调用到这些内部API。那么在Java17以后将不再能调用它们,所以会有不兼容的问题。这种问题的典型错误信息:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project api-brood-base: Fatal error compiling: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed mole @0x5740ff5e) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in mole jdk.compiler) because mole jdk.compiler does not export com.sun.tools.javac.processing to unnamed mole @0x5740ff5e -> [Help 1]这里的关键信息就是cannot access class xxx (in mole jdk.xxx) because mole jdk.xxx does not export xxx to xxx,一旦看到这句错误信息,就知道这是由于JDK加强了内部API的封装所导致的不兼容问题。解决起来很简单,找个新版本就行了。以lombok为例,升级到版本1.18.24即可。其他类库的包也有可能出现类似的问题,解决方法一样,换用更新的兼容Java17的版本即可。2.5.2 redisTemplate版本不兼容如果使用了spring的redisTemplate,那么有可能出现版本不兼容,包括:redisTemplate.delete方法编译错误,方法参数的泛型发生了变化。// 版本升级前编译OK,升级后编译错误 redisTemplate.delete(CollectionUtils.arrayToList(key)); // 版本升级后修改如下 redisTemplate.delete(Arrays.asList(key));GenericObjectPoolConfig的setMaxWaitMillis被废弃不再推荐使用,用setMaxWait代替:GenericObjectPoolConfig<?> genericObjectPoolConfig = new GenericObjectPoolConfig<>(); … // genericObjectPoolConfig.setMaxWaitMillis(redisProps.getPool().getMaxWait()); genericObjectPoolConfig.setMaxWait(Duration.ofMillis(redisProps.getPool().getMaxWait()));2.5.3 jackson版本不兼容spring默认使用的json工具类库jackson,它的ObjectMapper的enableDefaultTyping被废弃不再推荐使用,使用activateDefaultTyping代替具体代码如下所示:ObjectMapper om = new ObjectMapper(); // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);2.5.4 循环依赖问题springboot的新版本默认不再支持bean的循环依赖,因此项目中有循环依赖的bean的话,会报错,例如:The dependencies of some of the beans in the application context form a cycle: xxxxxxxxx ┌─────┐ | xxxService1 (field private com.gcsoft.brood.sentry.service.XxxService2 com.gcsoft.brood.sentry.service.xxxService1.xxxService2) ↑ ↓ | xxxService2 (field private com.gcsoft.brood.sentry.service.XxxService1 com.gcsoft.brood.sentry.service.XxxService2.xxxService1) └─────┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.最好的对应方式是消去bean之间的循环依赖,否则就需要显式声明允许bean的循环依赖,在application.yml中加入属性:spring: main: allow-circular-references: true2.5.5 缺少spring.config.import配置如果在pom工程中依赖了springcloud的相关jar,但并没有使用springcloud相关的config配置,那么在启动springboot服务时可能会失败:No spring.config.import property has been defined Action: Add a spring.config.import=configserver: property to your configuration. If configuration is not required add spring.config.import=optional:configserver: instead. To disable this check, set spring.cloud.config.enabled=false or spring.cloud.config.import-check.enabled=false.按照提示,在application.yml中加入属性:spring: cloud: config: enabled: false2.5.6 jetty版本冲突springboot版本升级后,内嵌的jetty版本也升级了。由于某些第三方jar使用了低版本的jetty的某些包,即使springboot没有使用jetty,也依然会在运行时发生jetty的不兼容问题:java.lang.ClassNotFoundException: org.eclipse.jetty.server.RequestLog$Writer这里可以选择升级第三方jar。或者直接去除第三方jar对jetty的依赖:<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hive.version}-${cdh.version}</version> <exclusions> <exclusion> <artifactId>jetty-all</artifactId> <groupId>org.eclipse.jetty.aggregate</groupId> </exclusion> </exclusions> </dependency>2.6 docker镜像在各个工程完成升级,编译成功,并简单运行OK之后,开始做docker镜像的升级工作。毕竟现在都在云端跑服务了。。。这里从Docker Hub上找了与开发使用的openJDK版本一致的docker镜像,也是由eclipse的Adoptium社区提供的。其实没有必要,其他openJDK17版本的docker镜像也是一样的,单纯的强迫症而已。。。docker pull eclipse-temurin:17.0.3_7-jdk-alpine对应docker hub地址:Docker Hub在这个openJDK17镜像的基础上,修改了时区与语言等信息,安装了bash与telnet,DockerFile如下:# 指定基础镜像,在其上进行定制(这里是 eclipse-temurin:17.0.3_7-jdk-alpine 的镜像) FROM eclipse-temurin:17.0.3_7-jdk-alpine # 定制环境变量 ENV TIME_ZONE=Asia/Shanghai \ LANG=en_US.UTF-8 \ LANGUAGE=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 # RUN在build镜像时执行,每RUN一次就会构成一层新的镜像。 # 因此有多个命令要执行时,用"&&"连接写在一起。 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.e.cn/g' /etc/apk/repositories \ && apk add –no-cache tzdata \ && echo "${TIME_ZONE}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \ && apk add –no-cache bash bash-doc bash-completion busybox-extras原始的eclipse-temurin:17.0.3_7-jdk-alpine有335M,添加了tzdata,bash,busybox-extras(telnet)之后,大小是340.8M。。。完整的JDK镜像就是这么大。。。如果生产环境不需要JDK,那么可以用JRE作成的镜像,会小不少,但是缺失了很多JDK工具。用这个DockerFile做成一个新的openJDK17镜像,命名为xxx/base-openjdk17:jdk-17.0.3_001,而各个springboot工程的DockerFile如下所示:# 指定基础镜像 FROM xxx/base-openjdk17:jdk-17.0.3_001 # JDK11开始支持: -XX:+UseContainerSupport 使JVM能够感知容器资源, -XX:InitialRAMPercentage 初期容器内存占比, -XX:MaxRAMPercentage 最大容器内存占比 ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:InitialRAMPercentage=50 -XX:MaxRAMPercentage=80" # 复制上下文目录下的target/*.jar 到容器里 ADD target/*.jar app.jar # 指定容器启动程序及参数 <ENTRYPOINT> "<CMD>" ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar该DockerFile位于springboot工程根目录下。打进了springboot fat jar的镜像会变得更大,一般都会有400M以上。。。三、小结总的来说,Java11到Java17的升级比较顺利,只有少数依赖包对应版本需要升级。另外就是springboot的升级可能导致需要添加少量配置,比如显式允许bean的循环依赖
⑥ idea打开的源文件用的jdk版本太老
1.本机默认使用(编译)的jdk与该项目所使用的jdk版本不同。滑兄启2.jdk版本不适用于这个Idea,很典型的一个例子就是使用的Idea是2020的,而你用到的jdk是17,jdk17是2021年推出的,所以你只能尘拦去安装新版本的idea。如果报错Error:Auto build failure: Cannot determine path to 'tools.jar' library for 17 (/Library/Java/JavaVirtualMachines/jdk-17.0.4.1.jdk/Contents/Home)也是这个原因导致的。该项目用的是什么版本的jdk请打开pom.xml查看信如:如何解决:1.修改项目使用的jdk版本,但是如果本来使用的是17,你降级为8,就可能导致某些代码不能实现。 (具体内容请看下面⬇️)2.安装新版本的Idea从而可以使用新的jdk。(我的另一篇博客说明如何安装IDEA2022,mac版本PoJie)
⑦ Idea中如何修改jdk的版本
在idea中修笑手改jdk版本分庆吵为三步,直接上图: 1.setting中的java complier选项 2.修改项目碰差嫌的sdk 3.修改mole的source源
⑧ idea2021.13可以配置jdk1.8吗
可以在IntelliJ IDEA 2021.3中配置JDK 1.8
⑨ idea未指定应用程序服务器
idea未指定应用程序服务器今天IDEA配置TOMCAT时发生了两个问题:1.setting设置打不开解决办法:耐基删除在IDEA安装目录下lib文件夹中resources_cn文件,打开后将会回到英文解决问题。2…IDEA配置TOMCAT的举亩简时候,选择了TOMCAT目录,点击OK,却报错 Application server libraries not found 。字面看是应用服务找不到jar包在这里插入图片描述解决办法:发现是jdk版本与tomcat版本不匹配的原因,jdk为1.8,正裤tomcat却是10.0.6,导致错误。更换tomcat版本号后正确。
⑩ IDEA报 JDK编译版本52,50的问题,怎么办
你直接去把 JDK版本改成1.6 就行了,根据你说的,猜测是这个问题