【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 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...
随机推荐
- QT博客:QT学习之路
http://www.qter.org/thread-629-1-1.html
- js自定义属性的操作
<body> <div id = "demo" index = "1" class = "nav"></div ...
- CISCO交换机STP实验(生成树协议)
目录 一.前言:生成树协议(STP) 二.CISCO交换机STP命令汇总 三.运用STP搭建简单拓扑 四.实战:STP综合实验 五.结语 一.前言:生成树协议(STP) 计算机网络中,我们为了减少网络 ...
- C++ CComboBox控件详解
转载:http://blog.sina.com.cn/s/blog_46d93f190100m395.html C++ CComboBox控件详解 (2010-09-14 14:03:44) 转载▼ ...
- C语言中time_t数据类型详细介绍
包含文件:<time.h> #ifndef __TIME_T #define __TIME_T /* 避免重复定义 time_t */ typedef long time_ ...
- Lane-Detection 近期车道线检测论文阅读总结
近期阅读的几篇关于车道线检测的论文总结. 1. 车道线检测任务需求分析 1.1 问题分析 针对车道线检测任务,需要明确的问题包括: (1)如何对车道线建模,即用什么方式来表示车道线. 从应用的角度来说 ...
- JavaScript封装函数:获取下一个/上一个兄弟元素节点
要求: 获得下一个/上一个兄弟元素节点,不包括文本节点等 解决IE兼容性问题 代码实现: 获得下一个兄弟元素节点: function getNextElement(element) { var el ...
- Docker镜像仓库Harbor部署
一.Harbor组件 组件 功能 harbor-adminserver 配置管理中心 harbor-db Mysql数据库 harbor-jobservice 负责镜像复制 harbor-log 记录 ...
- 用c语言实现linux cat
话不多说,直接上代码: #include <stdio.h> void file_copy(FILE * file1,FILE * file2); int main(int argc,ch ...
- CSS语法规范与代码风格
CSS语法规范与代码风格 1. 语法规范 CSS规则又两个主要的部分构成:选择器+一条或多条声明. 选择器:用于指定CSS样式的HTML标签,花括号内的是设置的具体样式 属性与属性值以键值对的形式出现 ...