我正在开发一个应用程序,该应用程序从具有jar依赖项的指定目录中动态编译和加载Java源文件。假设我们具有以下目录结构:
project
| lib
| dependency1.jar
| dependency2.jar
| dependency3.jar //used only by dependency1.jar
| src
| mypackage
| ClassA.java //uses dependency1.jar
| ClassB.java //uses dependency2.jar
我希望类ClassA
和ClassB
在运行时实例化和使用Java Reflection->作为Class<?>
对象的方法执行时都可用。
我当前正在使用以下编译器参数运行编译,该参数始终以编译错误告终,即导入的包不存在。如果src目录中的所有类都不使用外部库,则一切正常。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
List<String> options = new LinkedList<>();
options.add("-d");
options.add("path-to-project-directory/build");
options.add("-cp");
options.add("lib;src");
...
,然后像这样加载:
File compiledDir = new File("path-to-project-directory/build");
ClassLoader cl = new URLClassLoader(new URL[]{ compiledDir.toURI().toURL() });
Class<?> classA = cl.loadClass("mypackage.ClassA");
与已编译的类一起正常工作。
我一直在阅读,这也许是一种增量编译?有没有解决方法?我不确定是否只是错过了一些东西,否则就不会那么容易。