我正在处理一个项目,其中部署在JBoss服务器上的企业存档(ear)需要动态编译(并运行)一个类。我使用javaccompiler类来完成此操作—复杂性来自于正在编译的类对ear中的ejb jar中包含的一些类的引用。
当部署的ear在部署时被"爆炸"时,这不是问题,因此它只是一个目录而不是存档-在这种情况下,我能够在编译器的-classpath选项中指定所需的jar,并且编译工作正常。不幸的是,由于我正在使用的系统的限制,将这些耳朵"爆炸"部署不是一个可接受的解决方案,并且编译器似乎无法"看到"所需的jar,当它被包装在存档中。
考虑到动态编译是从有问题的ear发生的,因此系统的类装入器可以访问所需jar的内容,是否有任何方法可以告诉编译器只使用系统类装入器装入的类?
我知道这是一个冗长的问题,但如果有任何帮助,我将不胜感激。
谢谢
似乎没有简单的方法可以让JavaCompiler
加载来自ClassLoader
的编译代码的依赖项。但是,可以直接实现JavaFileManager
,并使用上下文ClassLoader
(getResource(<class/resource name>)
)上的资源查找来重定向StandardLocation.CLASS_PATH
的操作。这将取消StandardJavaFileManager
直接操作File
的限制。
似乎已经有人原型地实现了这种方法:http://atamur.blogspot.de/2009/10/using-built-in-javacompiler-with-custom.html