问题
I am working on a project in which an enterprise archive (ear) deployed on a JBoss server needs to compile (and run) a class dynamically. I am using the JavaCompiler class to do this - the complication comes from the fact that the class being compiled has references to some of the classes contained within the ejb jar within the ear.
This is not a problem when the deployed ear is 'exploded' on deployment, so it is just a directory rather than an archive - in this case I am able to specify the required jar in the -classpath option of the compiler, and compilation works fine. Unfortunately due to constraints of the systems I am working with, it is not an acceptable solution to deploy these ears 'exploded', and the compiler seems not to be able to 'see' the required jar when it's wrapped up in an archive.
Given that the dynamic compilation is taking place from the ear in question, and therefore the system's class loader has access to the contents of the required jar, is there any way I can tell the compiler to just use the classes as loaded by the system class loader?
I appreciate this is something of a wordy question, but any help would be appreciated.
Thanks
回答1:
It seems that there is no simple way to have the JavaCompiler
load dependencies of compiled code from a ClassLoader
. However, one could implement JavaFileManager
directly and redirect the operations for the StandardLocation.CLASS_PATH
using resource lookups on the context ClassLoader
(getResource(<class/resource name>)
). This would withdraw the limitation of StandardJavaFileManager
directly operating on File
s.
Someone already seems to have prototypically implemented that approch: http://atamur.blogspot.de/2009/10/using-built-in-javacompiler-with-custom.html
来源:https://stackoverflow.com/questions/16477606/using-javacompiler-with-classpath-referencing-jars-within-ear