项目环境:Maven
、JDK 11
(其他版本的 JDK
也类似), MacOS
(Windows
下 IDEA
配置界面可能会不同)
项目场景 – 这是复(废)现(话)
IDEA
导入一个已经存在的项目(替换为 demo
项目),被告知项目用的是 JDK 11
。导入成功后,点击 File -> Project Structure
,并将下面修改为 JDK 11
。
搞定,,,运行代码(如此简单,脸上开始浮现笑容,内心美滋滋)。
然后就:
Information:java: Errors occurred while compiling module 'demo'
Information:javac 11.0.9 was used to compile java sources
Information:6/1/22, 10:59 AM - Build completed with 1 error and 0 warnings in 2 s 391 ms
# com.sun.jndi.toolkit.dir 这个包不存在
Error:(3, 32) java: package com.sun.jndi.toolkit.dir does not exist
脸上的笑容逐渐消失,内心开始骂骂咧咧。
点击报错,跳转后一看,代码里面用到了 import com.sun.jndi.toolkit.dir.SearchFilter
这个类:
package com.example.demo;
import com.sun.jndi.toolkit.dir.SearchFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
可是 com.sun.jndi.toolkit.dir
这个包在 JDK 11 中是存在的呀,为什么会找不到呢??
看到这直觉告诉我,肯定又是使用 JDK 的问题。。。因为之前已经写过一篇关于 JDK
com.sun
包的文章,文章地址: Error:(16, 42) java: package com.sun.org.apache.regexp.internal does not exist 。
打开之前文章仔细对比后,发现这两者还是有区别的,之前写的 JDK
中确实已经移除相应的代码了,报错是正常的,(如果是这种情况,请看上面的文章);但是这次 JDK
中明明存在,但是最终也报错了,确实有些无从下手。但是正在大把大把抓头发时,再次仔细的看报错信息,忽然发现了一个切入点:Errors occurred while compiling module 'demo'
# 报错信息
Information:java: Errors occurred while compiling module 'demo'
Information:javac 11.0.9 was used to compile java sources
Information:6/1/22, 10:59 AM - Build completed with 1 error and 0 warnings in 2 s 391 ms
# com.sun.jndi.toolkit.dir 这个包不存在
Error:(3, 32) java: package com.sun.jndi.toolkit.dir does not exist
当编译这个 demo
模块是发生错误,看样子是在编译期间。然后去 IDEA
配置文件中去查看:
???这里的 Target bytecode version
怎么是 1.8
。。。然后去 pom.xml
看了一下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
....
<name>demo</name>
<properties>
<java.version>1.8</java.version>
</properties>
....
<!-- 有的分模块项目中可能存在下面的配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 这里推荐使用 ${java.version},而不是硬编码 -->
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Maven
这里使用的是 JDK 1.8
: <java.version>1.8</java.version>
,项目明明都要用 JDK 11
了,Maven
这里竟然没有改。。。 由此猜测:要么项目是 JDK 1.8
升级到 JDK 11
,要么 pom.xml
配置文件是从之前 JDK 1.8
项目中复制过来的。
解决方案 – 跳过复(废)现(话)
通过上面的排查,大概率已经确认了问题所在。有的人也有可能觉着直接下面中选择 11
就可以,但是并不推荐,毕竟只对你本地的 IDEA
有效( For current proejct
)。
看这里》》》》:所以最正确的方式,还是修改 pom.xml
文件,让其编译方式与项目所使用的的 JDK
对应起来,IDEA
中的 Target bytecode version
会自动匹配成 Maven
中的配置。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
....
<name>demo</name>
<properties>
<java.version>11</java.version>
</properties>
....
<!-- 有的分模块项目中可能存在下面的配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 这里推荐使用 ${java.version},而不是硬编码 -->
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
折腾完成,又可以开心的撸代码了!!!