javac编译错误: 程序包 com.sun.xxx 不存在
文章目录
- 运行环境
- 一、问题描述
- 二、探究过程
- 三、原因
- 四、解决方式
- 五、总结
- 六、参考链接
运行环境
- Java版本:java version “1.8.0_281”
- 操作系统:Windows 10
一、问题描述
- 问题来源于编译项目代码,其中有一个类引用了
com.sun
下的类
com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
- 单独写一个测试类
TestMimeUtility.java
研究下…
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;public class TestMimeUtility {public static void main(String[] args) {System.out.println("TestMimeUtility");System.out.println(MimeUtility.ALL);}
}
- 使用javac编译直接报错
二、探究过程
- 首先,该类属于基础类库
rt.jar
包下的类
- 这时候用
-verbose
看看类文件搜索路径是不是出了问题
- 可以得出类文件搜索路径已经包含了
rt.jar
(题外话:网上说CLASSPATH环境变量添加rt.jar
其实多此一举了,至少在Java8是不用加的,之前版本没试过),但是还意外看到这么个输出信息:
- 也就是说javac编译时还和
%JAVA_HOME%\lib\ct.sym
这个文件有关系,于是我用相应解压缩软件打开,发现并没有com.sun.xml
包,所以说未找到这个类的原因来自于这里,问题定位到ct.sym
文件
三、原因
于是我网上找到相应的issue查了下原因,大致如下:
- 在JDK6以及以后的版本【版本我没有去确认】,JDK在目录下新增了一个链接文件
${JDK_HOME}/lib/ct.sym。
在使用javac命令进行编译代码时,默认使用该文件进行编译时class类的检查和链接,而不是直接使用%JAVA_HOME%/jre/lib/rt.jar
- 该文件保存了JDK建议使用的类描述信息。
com.sun.*
包和sun.*
包,以及新的jdk.*
都不是Open的API,这些类的接口可能在之后的版本变动,也不保证平台移植性。【编译时会有警告或者是找不到类】 - 事实上,JDK提供的Public API,仅有三个包:
java.*
、javax.*
、org.*
。它们是官方支持的公共接口
四、解决方式
1. 如果是自己写的类依赖了这些类,建议进行重写替换,避免后续系统升级给其他维护人员带来麻烦!
2. 如果一定要编译,可以在编译时添加忽略链接文件选项:-XDignore.symbol.file
- javac
javac -XDignore.symbol.file TestMimeUtility.java
- Maven
<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.6.0</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><compilerArgs><arg>-XDignore.symbol.file</arg></compilerArgs><fork>true</fork></configuration></plugin></plugins>
</build>
- Ant
<target name="compile"><javacdestdir="${build.dir}"encoding="UTF-8"source="1.8"target="1.8"><src path="${src.dir}"/><compilerarg value="-XDignore.symbol.file"/> <classpath refid="classpath" /></javac>
</target>
3.类文件搜索路径添加另一个rt.jar的路径
- 网上好像挺多人用这个方式的,直接把
rt.jar
替换掉,但其实知道怎么回事后还不如直接使用-XDignore.symbol.file
选项呢…- 另外要注意的是另一个
rt.jar
路径不能是%JAVA_HOME%\jre\lib\rt.jar
,类搜索路径已经有了该路径并且已经 被列入黑名单了,加上去和没加一样
javac -classpath YOUR_PATH\rt.jar TestMimeUtility.java
- 执行结果:
五、总结
- 建议不要使用
"sun.*"
或"com.sun."
包中的类,避免在项目迁移出现问题,因为它们不是Java API中的一部分 - IDEA,Eclipse工具竟然可以正确!正常!编译这些代码,好歹给个警告啊,就这么纵容吗~
六、参考链接
- java代码中调用受限制的JDK API
- Javac命令使用ct.sym文件约束可使用的类
- import com.sun.image.codec.jpeg.*
javac编译错误: 程序包 com.sun.xxx 不存在相关推荐
- 解决maven 引用JDK内部类编译错误 程序包:com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler不存在...
解决maven 引用JDK内部类编译错误 程序包:com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler不存在- 网上很多帖子的解决方案 ...
- java编译错误 程序包javax.servlet不存在javax.servlet.*
java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...
- 错误: 程序包com.sun.istack.internal不存在
[ERROR] D:\code-old\daba_user_mvn\src\main\java\com\dada\transaction\service\KmService.java:[4,30] 错 ...
- Maven compile 编译后Error:(8,31) java: 程序包com.sun.istack.internal不存在 Error:(318,57) java: 找不到符号的解决办法
是因为代码里使用了 sun 私有包中 @NotNull注解导致,只要引入相应的sun私有包就行了!! 网上看到的解决办法:如下 KmService.java:[4,30] 错误: 程序包com.sun ...
- java: 程序包com.sun.xml.internal.ws.api.ha不存在
用maven运行项目的时候,compile不通过,会报一个: Error:(6,38) java: 程序包com.sun.xml.internal.ws.api.ha不存在. 方法一:在配置文件中加入 ...
- Idea 遇到:com.sun.istack.internal不存在和程序包com.sun.image.codec.jpeg不存在
com.sun.istack.internal不存在: 在maven中的org.apache.maven.plugins下面添加: <plugin><groupId>org.a ...
- Sping boot】 错误: 程序包不存在
[Sping boot] 错误: 程序包xxx 不存在 这个问题,网上有好多解决方案,对应不同情况,我记录一下新的情况! 这个问题,网上有好多解决方案,对应不同情况,我记录一下新的情况! 在试了好多方 ...
- Data Binding的报错集合 例如Error 10 54 错误 程序包com kodulf recycl
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 报错0: ...
- JavaSE —— 使用 Javac 编译 Java 程序
使用 Javac 编译 Java 程序 新建一个 Java 文件 右键 选择 新建 文本文档 将文件后缀名改为 .java 注意:要勾选选上 显示 文件扩展名 编写 程序: public class ...
最新文章
- 晶体管逻辑芯片设计微缩图形化
- C#判断年份是否为闰年
- [转]Java中Set的深入研究
- 数控铣削图案及编程_数控铣削简单图案编程
- IBM X System ServerGuide 8.41 服务器 系统安装 引导盘
- icloud 购买存储空间_如何释放iCloud存储空间
- zlib的安装与使用
- c语言 关键字符,c语言关键字有哪些 c语言关键字解释
- 网络安全等级保护基本要求
- checkbook实现任何颜色背景
- RichText widgets require a Directionality widget ancestor.
- 汽车控制器(ECU)中DTC的状态位
- 麦子学院Linux教程:环境搭建
- Foxmail中配置O365邮箱和Hotmail邮箱
- 出租房安装监控摄像头的必要性
- 计算机初中毕业好学吗,初中毕业学计算机好学吗?
- 中国象棋总体设计 中国象棋课设02
- 深入剖析原理!Android面试你必须要知道的那些知识,吐血整理
- 绿色数据中心:避免能耗还是提高能效
- Flink 笔记01:安装部署与快速入门
热门文章
- 深度学习之GPU编程知识总结
- SSL证书链不完整(或不被客户端信任)问题,填坑
- Java——快手2020校园招聘秋招笔试--[编程题]运动会
- android爬楼梯动画,TweenMax+Three.js 立方体爬楼梯动画
- jmeter的Body Data怎样使用?
- java 画笔_JAVA画笔(paint)的使用
- “此用户无法登陆,因为该用户当前已被禁用“,应该怎么解决?#经验#
- 解决Spyder无法抓取Yahoo!finance财经数据
- 漫谈深度学习 这个领域有点火!
- datasnap出现connection closed gracefully错误的解决办法