jdk8升到jdk11报错,com.sun.tools.classfile 不可见,程序包 com.sun.tools.classfile 已在模块 jdk.jdeps 中声明, 但该模块不在模块图中

本文主要是介绍jdk8升到jdk11报错,com.sun.tools.classfile 不可见,程序包 com.sun.tools.classfile 已在模块 jdk.jdeps 中声明, 但该模块不在模块图中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 foundat 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("/",".");}

这篇关于jdk8升到jdk11报错,com.sun.tools.classfile 不可见,程序包 com.sun.tools.classfile 已在模块 jdk.jdeps 中声明, 但该模块不在模块图中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748408

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

Python报错ModuleNotFoundError的10种解决方案

《Python报错ModuleNotFoundError的10种解决方案》在Python开发中,ModuleNotFoundError是最常见的运行时错误之一,通常由模块路径配置错误、依赖缺失或命名冲... 目录一、常见错误场景与原因分析二、10种解决方案与代码示例1. 检查并安装缺失模块2. 动态添加模块

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas