JDK8升级至JDK11

bingo 2020年01月19日 45次浏览

JDK8升级至JDK11

存在的public class无法访问

情景:原来JDK8中引用com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl,到了JDK11发现编译报错提示

package com.sun.org.apache.xerces.internal.jaxp.datatype is not visible [ERROR] (package com.sun.org.apache.xerces.internal.jaxp.datatype is declared in module java.xml, which does not export it)

于是开始关于自JDK9引入module概念的了解。详情参照[传送门][1]

原来自JDK9开始后,增加了更加严格的访问机制,引用资料的话来说module is package of Java Packages.

回到问题本身,XMLGregorianCalendarImpl来自JDK jrt-fs.jar->java.xml,其根目录下的module-info.java声明如下:


并没有出现exports com.sun.org.apache.xerces.internal.jaxp.datatype

所以就有了明明XMLGregorianCalendarImpl的访问权限是public,但仍然无法访问的问题。

解决问题: 既然XMLGregorianCalendarImpl现在已经无法通过外接直接访问,我猜可能通过某种包装后再进行暴露 发现XMLGregorianCalendarImpl被com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar()调用 DatatypeFactoryImpl被javax.xml.datatype.DatatypeFactory.newFaultInstance()调用。

然后再看看javax.xml.datatype是否在module-info.java中有暴露出去

所以通过DatatypeFactory.newFaultInstance().newXMLGregorianCalendar()得到XMLGregorianCalendarImpl

剔除掉的jar包

参考这里