Error:(6, 32) java: package com.sun.jndi.toolkit.dir does not exist

项目环境:MavenJDK 11 (其他版本的 JDK 也类似), MacOS (WindowsIDEA 配置界面可能会不同)

项目场景 – 这是复(废)现(话)

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>

折腾完成,又可以开心的撸代码了!!!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注