views:

351

answers:

6

Is it possible to specify a custom classloader for javac (or some alternative java compiler)?

I'd love such a feat because it would allow me to compile classes that use classes that are only found by my special classloader.

For the curious once: I'd write a classloder that connects to a database and creates classes based on the tables it finds.

+4  A: 

It may be possible to initialize a custom classloader and then use it while calling the new Java 6 Compiler API in javax.tools.

Michael Borgwardt
A: 

Just to expand on Michael's answer, if you cannot use Java6, look at the sun. packages--they have always been available to java apps and have always had a compiler in there, it's just not standard Java so you don't hear about it much and the API is subject to change (like moving it to the javax.tools package!)

Bill K
+1  A: 

The only two ways I know of plugging directly into javac (as run on the command line) are via the annotation processor or via a compiler-specific hack.

McDowell
cool hack, although not suitable for my problem
Jens Schauder
A: 

Take a look at ClassLoader.defineClass. I used it myself for loading plugins into a program I created, in which I loaded a file's bytes into a new class.

Patrick
+5  A: 

When you run javac you can specify the classloader like so:

javac -J-Djava.system.class.loader=org.awesome.classloader sourcefile.java
Hardwareguy
A: 

If the classes all conform to the same Interface you could just provide that at compile time..

If not then I don't see what you are gaining by not outputing .java files based on the DB and compiling that.

Chris Nava
The 'problem' with generation java files and compiling them is it is a separate step. So if someone changes the database the classes don't fit and one gets cryptic sql exceptions.
Jens Schauder