以编程方式编译java文件
我知道这已经被问及了很多,但我仍然没有一个很好的解决方案,我仍然不明白一些部??分.所以我需要以编程方式编译* .
java文件.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 是我使用的(和预期的)编译器是空的. 我也尝试创建一个自定义的ClassLoader并且使用反射来调用上面提到的方法,但是我所获得的所有编译器对象都是空的: ClassLoader classloader = app.classloader(); File file = new File("lib/tools.jar"); URL url = file.toURI().toURL(); URL[] urls = new URL[]{url}; ClassLoader newCL = new URLClassLoader(urls,classloader) { }; Class<?> loadClass = newCL.loadClass("javax.tools.ToolProvider"); Method method = loadClass.getMethod("getSystemJavaCompiler",null); Object object = method.invoke(null); System.out.println("Object: " + object); // NULL 上面的代码说明: >为了简单起见,我没有包括try / catch. 我确定还有其他一些我需要做的事情之前,Play可以加载Java编译器类,我只是不知道我缺少什么. 像Runtime.exec(“javac myFile.java”)和Eclipse JDT编译器这样的选项对我来说是已知的,但这不是我正在寻找的. 哦,像System.setProperty(“java.home”,“PATH_TO_YOUR_JDK”)这样的东西;然后ToolProvider.getSystemJavaCompiler();正在工作,但我发现这个解决方案如此丑陋. 最好的祝福 编辑:(提供更多信息并反映最后的状态) myApp |-conf... |-libMyJar.jar |-libtools.jar |-logs... |-... MyJar.jar现在有一个META-INF / MANIFEST.MF文件,内容如下: Manifest-Version: 1.0 Sealed: true Main-Class: here.comes.my.main.class Class-Path: tools.jar 没有启动Play应用程序,我正在尝试(在lib文件夹中):java -jar MyJar.jar – 我的简单主方法尝试调用编译器(ToolProvider.getSystemJavaCompiler();)并返回null.所以这让我相信,这个问题与播放无关 – 我甚至不能得到一个编译器,当正常运行我的Jar! 解决方法
Web应用程序和独立应用程序之间没有区别.
您不应该将tools.jar打包到您的webapp类路径中. Java中的类加载器通常只能从底部起作用.因此,作为jdk一部分的ToolProvider将不会在webapp类路径中看到您的tools.jar(它不能向下看到webapp类路径). 解决方案:使用JDK,确保指向或将tools.jar放在Java ext dir中.您可以通过将属性-Djava.ext.dir设置为您喜欢的任何目录来覆盖ext dir. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |