文章目录

  • 运行环境
  • 一、问题描述
  • 二、探究过程
  • 三、原因
  • 四、解决方式
  • 五、总结
  • 六、参考链接

运行环境

  • 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 不存在相关推荐

  1. 解决maven 引用JDK内部类编译错误 程序包:com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler不存在...

    解决maven 引用JDK内部类编译错误 程序包:com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler不存在- 网上很多帖子的解决方案 ...

  2. java编译错误 程序包javax.servlet不存在javax.servlet.*

    java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...

  3. 错误: 程序包com.sun.istack.internal不存在

    [ERROR] D:\code-old\daba_user_mvn\src\main\java\com\dada\transaction\service\KmService.java:[4,30] 错 ...

  4. Maven compile 编译后Error:(8,31) java: 程序包com.sun.istack.internal不存在 Error:(318,57) java: 找不到符号的解决办法

    是因为代码里使用了 sun 私有包中 @NotNull注解导致,只要引入相应的sun私有包就行了!! 网上看到的解决办法:如下 KmService.java:[4,30] 错误: 程序包com.sun ...

  5. java: 程序包com.sun.xml.internal.ws.api.ha不存在

    用maven运行项目的时候,compile不通过,会报一个: Error:(6,38) java: 程序包com.sun.xml.internal.ws.api.ha不存在. 方法一:在配置文件中加入 ...

  6. Idea 遇到:com.sun.istack.internal不存在和程序包com.sun.image.codec.jpeg不存在

    com.sun.istack.internal不存在: 在maven中的org.apache.maven.plugins下面添加: <plugin><groupId>org.a ...

  7. Sping boot】 错误: 程序包不存在

    [Sping boot] 错误: 程序包xxx 不存在 这个问题,网上有好多解决方案,对应不同情况,我记录一下新的情况! 这个问题,网上有好多解决方案,对应不同情况,我记录一下新的情况! 在试了好多方 ...

  8. Data Binding的报错集合 例如Error 10 54 错误 程序包com kodulf recycl

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 报错0: ...

  9. JavaSE —— 使用 Javac 编译 Java 程序

    使用 Javac 编译 Java 程序 新建一个 Java 文件 右键 选择 新建 文本文档 将文件后缀名改为 .java 注意:要勾选选上 显示 文件扩展名 编写 程序: public class ...

最新文章

  1. 晶体管逻辑芯片设计微缩图形化
  2. C#判断年份是否为闰年
  3. [转]Java中Set的深入研究
  4. 数控铣削图案及编程_数控铣削简单图案编程
  5. IBM X System ServerGuide 8.41 服务器 系统安装 引导盘
  6. icloud 购买存储空间_如何释放iCloud存储空间
  7. zlib的安装与使用
  8. c语言 关键字符,c语言关键字有哪些 c语言关键字解释
  9. 网络安全等级保护基本要求
  10. checkbook实现任何颜色背景
  11. RichText widgets require a Directionality widget ancestor.
  12. 汽车控制器(ECU)中DTC的状态位
  13. 麦子学院Linux教程:环境搭建
  14. Foxmail中配置O365邮箱和Hotmail邮箱
  15. 出租房安装监控摄像头的必要性
  16. 计算机初中毕业好学吗,初中毕业学计算机好学吗?
  17. 中国象棋总体设计 中国象棋课设02
  18. 深入剖析原理!Android面试你必须要知道的那些知识,吐血整理
  19. 绿色数据中心:避免能耗还是提高能效
  20. Flink 笔记01:安装部署与快速入门

热门文章

  1. 深度学习之GPU编程知识总结
  2. SSL证书链不完整(或不被客户端信任)问题,填坑
  3. Java——快手2020校园招聘秋招笔试--[编程题]运动会
  4. android爬楼梯动画,TweenMax+Three.js 立方体爬楼梯动画
  5. jmeter的Body Data怎样使用?
  6. java 画笔_JAVA画笔(paint)的使用
  7. “此用户无法登陆,因为该用户当前已被禁用“,应该怎么解决?#经验#
  8. 解决Spyder无法抓取Yahoo!finance财经数据
  9. 漫谈深度学习 这个领域有点火!
  10. datasnap出现connection closed gracefully错误的解决办法