jdk8升到jdk11报错,java: 程序包 com.sun.tools.classfile 不可见
(程序包 com.sun.tools.classfile 已在模块 jdk.jdeps 中声明, 但该模块不在模块图中)
原因:classfile 在jdk8中tools文件中,jdk11转到了别的包中,导致了不可见
问题:
在原项目中使用jdk8,升级到jdk11,原项目中使用了tools包中classFile类读取className
public String readClassName(byte[] bytes) throws ConstantPoolException, IOException {
DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes));
ClassFile read = ClassFile.read(dataInputStream);
return read.getName().replaceAll("/", ".");
}
在jdk11项目中引入jdk8的tools包后,出现报错
com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider not found
java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider not found
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:589)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1212)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1221)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1265)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
at jdk.attach/com.sun.tools.attach.spi.AttachProvider.providers(AttachProvider.java:258)
at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:200)
解决方案:不用这个包读取class文件,可以引入asm包二进制读取文件。
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>2.2.3</version>
</dependency>
asm根据二进制文件读取className
public String readClassName(byte[] bytes) throws Exception {
return new ClassReader(bytes).getClassName().replace("/",".");
}