使用jar依赖项动态编译和加载Java类

时间:2019-05-07 14:01:49

标签: java compilation classloader

我正在开发一个应用程序,该应用程序从具有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

我希望类ClassAClassB在运行时实例化和使用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");

与已编译的类一起正常工作。

我一直在阅读,这也许是一种增量编译?有没有解决方法?我不确定是否只是错过了一些东西,否则就不会那么容易。

0 个答案:

没有答案