【Javac编译异常】javac编译提示jdk中的包找不到的问题error: package jdk.internal.org.objectweb.asm does not exist 和 error: cannot find symbol
一、复现步骤
1)编写待编译的java类
package f_asm_and_javassist; import jdk.internal.org.objectweb.asm.*; import java.io.*; import static jdk.internal.org.objectweb.asm.Opcodes.ASM5; /**
* @Author zhangboqing
* @Date 2020/3/26
*/
public class AsmDemo { //访问类的方法和字段
public static void main(String[] args) {
byte[] bytes = getBytes(); // MyMain.class 文件的字节数组
ClassReader cr = new ClassReader(bytes);
ClassWriter cw = new ClassWriter(0);
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
@Override
public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
System.out.println("field: " + name);
return super.visitField(access, name, desc, signature, value);
} @Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
System.out.println("method: " + name);
return super.visitMethod(access, name, desc, signature, exceptions);
}
};
cr.accept(cv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG);
} private static byte[] getBytes() { StringBuilder sb = new StringBuilder();
try(FileInputStream fileInputStream = new FileInputStream(new File("MyMain.class"));
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) { byte[] buffer = new byte[1024*8];
while (bufferedInputStream.available() > 0) { int length = bufferedInputStream.read(buffer);
sb.append(new String(buffer,0,length) );
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return sb.toString().getBytes();
}
}
2)在当前目录使用javac编译
javac -d . AsmDemo.java
提示如下错误:
➜ f_asm_and_javassist git:(master) ✗ javac -d . AsmDemo.java
AsmDemo.java:3: error: package jdk.internal.org.objectweb.asm does not exist
import jdk.internal.org.objectweb.asm.*;
^
AsmDemo.java:7: error: package jdk.internal.org.objectweb.asm does not exist
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
^
AsmDemo.java:7: error: static import only from classes and interfaces
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
^
AsmDemo.java:18: error: cannot find symbol
ClassReader cr = new ClassReader(bytes);
^
symbol: class ClassReader
location: class AsmDemo
AsmDemo.java:18: error: cannot find symbol
ClassReader cr = new ClassReader(bytes);
^
symbol: class ClassReader
location: class AsmDemo
AsmDemo.java:19: error: cannot find symbol
ClassWriter cw = new ClassWriter(0);
^
symbol: class ClassWriter
location: class AsmDemo
AsmDemo.java:19: error: cannot find symbol
ClassWriter cw = new ClassWriter(0);
^
symbol: class ClassWriter
location: class AsmDemo
AsmDemo.java:20: error: cannot find symbol
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
^
symbol: class ClassVisitor
location: class AsmDemo
AsmDemo.java:20: error: cannot find symbol
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
^
symbol: class ClassVisitor
location: class AsmDemo
AsmDemo.java:20: error: cannot find symbol
ClassVisitor cv = new ClassVisitor(ASM5, cw) {
^
symbol: variable ASM5
location: class AsmDemo
AsmDemo.java:33: error: cannot find symbol
cr.accept(cv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG);
^
symbol: variable ClassReader
location: class AsmDemo
AsmDemo.java:33: error: cannot find symbol
cr.accept(cv, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG);
^
symbol: variable ClassReader
location: class AsmDemo
12 errors
二、解决办法
这就是javac的限制。默认情况下,javac不会从rt.jar中读取类。它从一个符号文件中读取,该文件只包含标准API和一些内部API(例如com.sun.,com.oracle.和sun . *)。
要禁用此机制,可以使用 javac -XDignore.symbol.file=true
使用maven可以用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-XDignore.symbol.file</compilerArgument>
</configuration>
</plugin>
上述问题采用下面命令执行就可以成功了:
javac -XDignore.symbol.file=true -d . AsmDemo.java
待包名的类,需要使用 -d .,表示在当前目录自动生成包路径
【Javac编译异常】javac编译提示jdk中的包找不到的问题error: package jdk.internal.org.objectweb.asm does not exist 和 error: cannot find symbol的更多相关文章
- JDK中Concurrent包介绍及使用(包含atomic包/lock包/并发容器/执行器)
Java Concurrent并发包概括 https://blog.csdn.net/u012232736/article/details/79919450 Java中的Atomic包使用指南 ...
- JDK中主要包的介绍
java.lang——包含一些Java语言的核心类,如String.Math.Integer.System和Thread,提供常用功能.java.net——包含执行与网络相关的操作的类和接口.java ...
- IDEA不自动提示仓库中有的包maven
- linux中管理包的apt和dpkg命令用法
1,apt-get命令 apt-get是debian,ubuntu发行版的包管理工具,与红帽中的yum工具非常类似,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸 ...
- Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决
今天学习java的接口,在linux的命令行下写代码练练手吧,啪啪啪一顿猛敲,写了一个接口UsbInserface,UDisk继承UsbInterface,写完了那就编译到bin目录呗. 当时写程序的 ...
- javac 编译与 JIT 编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译和JIT编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译与JIT编译
本文转载自:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的 ...
- 【深入Java虚拟机】之七:Javac编译与JIT编译
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...
随机推荐
- Python练习题 005:三个数字由大到小排序输出
[Python练习题 005]输入三个整数x,y,z,请把这三个数由小到大输出. ----------------------------------------------------------- ...
- VS 高级版本新建的项目如何降级使低版本 VS 可以打开
转载:https://blog.csdn.net/u012814856/article/details/70325267 一.引言 这里因为工作的原因,公司项目使用的是 VS2015 的编译环境,但是 ...
- 什么是ICD文件
ICD就是IED Capability Description的简称,中文为IED能力描述文件.其中 IED是Intelligent Electronic Device的简称,是智能电子设备 智能电子 ...
- 【Rsync实战】Rsync 备份的配置与管理
一.Rsync 基本概述 rsync 是一款开源的备份工具,可以在不同主机之间进行同步,可实现全量备份与增量备份,因此非常适合用于架构集中式备份或异地备份等应用. rsync 官方地址: rsync ...
- activiti 流程部署 保存流程图到数据库 保存二进制图片 存储失败
activiti 流程部署 保存流程图到数据库 保存二进制图片 存储失败 具体错误如下 具体 junit测试 结果 :提示如下: 解决方法: 数据库版本不同 无法保存二进制文件到数据库表中!5.5. ...
- pytest使用小结
一.pytest简洁和好处 自动发现测试用例 testloader 断言方便 ,自定义错误提示 assert 正则匹配 灵活运行指定的测试用例,指定模块,制定测试类,测试用例 -k 标签化,回归 正向 ...
- CentOS 7系统常见快捷键操作方式
快捷键操作方式 Linux系统中一些常见的快捷方式,可有效提高操作效率,在某些时刻也能避免操作失误带来的问题. 最有用的快捷键 序号 快捷键 官方说明 掌握程度 01 Tab 命令或路径等的补全键 移 ...
- 三色二叉树 ---伪树形dp
题目描述 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 ...
- rabbitmq--通配符模式Topics
topic模式也称为主题模式,其实他相对于routing模式最大的好处就是他多了一种匹配模式的路由,怎么理解匹配呢,其实就相当于我们之前正则的.*这种,不过他的匹配机制可能不是这种(其实除了匹配规则外 ...
- ansible:安装nginx1.18.0(使用role功能)
一,ansible使用role的用途? roles分别将变量/文件/任务/模板/handler等放置于单独的目录中, 并可以方便的include各目录下的功能 roles使playbook能实现代码被 ...