java动态编译遇到灵异事件,求围观?
答案:2 悬赏:30 手机版
解决时间 2021-11-29 03:31
- 提问者网友:十年饮冰
- 2021-11-28 20:14
java动态编译遇到灵异事件,求围观?
最佳答案
- 五星知识达人网友:我住北渡口
- 2021-11-28 20:40
看源码不就好了?
ToolProvider里的:
private static final String[] defaultToolsLocation
= { "lib", "tools.jar" };
private static Class> findClass()
throws MalformedURLException, ClassNotFoundException {
try {
return enableAsserts(Class.forName(defaultJavaCompilerName, false, null));
} catch (ClassNotFoundException e) {
// ignored, try looking else where
}
File file = new File(System.getProperty("java.home"));
if (file.getName().equalsIgnoreCase("jre"))
file = file.getParentFile();
for (String name : defaultToolsLocation)
file = new File(file, name);
URL[] urls = {file.toURI().toURL()};
ClassLoader cl = URLClassLoader.newInstance(urls);
cl.setPackageAssertionStatus("com.sun.tools.javac", true);
return Class.forName(defaultJavaCompilerName, false, cl);
}从java.home拿的路径,如果名字是jre,就找父目录
那java.home取出来是什么?还是看源码,参考open jdk的,比较长就不帖了,有兴趣可以自己搜,发链接审核估计会不通过,反正开源的很容易找
oracle官方对java.home的定义是Installation directory for Java Runtime Environment (JRE),这个在官方的The Java™ Tutorials里可以找到
所以可以看到如果java.home取到jdk下的jre,那自然可以从父目录/lib找到tool.jar,如果取的是和jdk同级的单独安装的那个jre,就得自己复制tool.jar
ToolProvider里的:
private static final String[] defaultToolsLocation
= { "lib", "tools.jar" };
private static Class> findClass()
throws MalformedURLException, ClassNotFoundException {
try {
return enableAsserts(Class.forName(defaultJavaCompilerName, false, null));
} catch (ClassNotFoundException e) {
// ignored, try looking else where
}
File file = new File(System.getProperty("java.home"));
if (file.getName().equalsIgnoreCase("jre"))
file = file.getParentFile();
for (String name : defaultToolsLocation)
file = new File(file, name);
URL[] urls = {file.toURI().toURL()};
ClassLoader cl = URLClassLoader.newInstance(urls);
cl.setPackageAssertionStatus("com.sun.tools.javac", true);
return Class.forName(defaultJavaCompilerName, false, cl);
}从java.home拿的路径,如果名字是jre,就找父目录
那java.home取出来是什么?还是看源码,参考open jdk的,比较长就不帖了,有兴趣可以自己搜,发链接审核估计会不通过,反正开源的很容易找
oracle官方对java.home的定义是Installation directory for Java Runtime Environment (JRE),这个在官方的The Java™ Tutorials里可以找到
所以可以看到如果java.home取到jdk下的jre,那自然可以从父目录/lib找到tool.jar,如果取的是和jdk同级的单独安装的那个jre,就得自己复制tool.jar
全部回答
- 1楼网友:空山清雨
- 2021-11-28 21:57
你用的应该是java8及以上版本吧。问题在于jre的安装程序,java8以后安装JRE时会向windows/System32目录写入一个java.exe这个java.exe会自动指向和jdk目录在同级的那个jre目录。就是你说的兄弟目录的jre。当运行时如果windows/System32/下能找到java.exe 就不会再使用环境变量的中指定的jdk目录下的jre了,所以必须把jdk的lib下的tools.jar拷贝到与jdk作为兄弟目录的jre下 才行。当然如果没有安装过jdk而是通过复制把jdk目录拖过去,再设置环境变量就会使用jdk目录下的jre了。当然如果你删掉windows/System32/下的java.exe,系统就会使用jdk目录下的那个jre了。检查看看你两个电脑的windows/System32/下就能明白。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯