ReflectException during runtime compilation within a fatjar
Closed this issue · 4 comments
Expected behavior and actual behavior:
Expected to compile a class mentioned in Reflect.compile(...)
Actual behaviour: throwing ReflectException whenever the pice of code is executed
Steps to reproduce the problem:
I was using JOOR in my Minecraft plugin,
This is all I did:
Create a method which returns
Reflect.compile(...).create(...).get();
Build the plugin and fatJar JOOR in it
Run the plugin in Minecraft server and you'll get the exception
Versions:
- jOOR:0.9.13
- Java:8
I'm not acquainted with Minecraft plugin development, or how to create a "fatjar plugin" for Minecraft. I would need some help reproducing this issue, but here's what I'd like you to check beforehand:
Does your target environment really support compiling Java code on the fly? jOOQ doesn't do anything on its own here, but delegates to the java.compiler
module, which is part of the JDK, but perhaps not of your runtime environment?
What's the exception you were getting?
This may be related: #69 (comment)
So apparently this happens for any jar files, Here's an example
import org.joor.Reflect;
public class Main {
public static void main(String[] args){
Reflect.compile("Name",
"public class Name{" +
" private String s;" +
" public Name(String s){" +
" this.s=s;" +
" }" +
" void printString(){" +
" System.out.println(\"Hi! \"+this.s);" +
" }" +
"}"
).create("Srinjoy").call("printString").get();
}
}
and this is the exception
$ java -jar /c/Users/Srinj/Desktop/JarjOOR.jar
Exception in thread "main" org.joor.ReflectException: Error while compiling Name
at org.joor.Compile.compile(Compile.java:158)
at org.joor.Reflect.compile(Reflect.java:104)
at Main.main(Main.java:12)
Caused by: java.lang.NullPointerException
at org.joor.Compile.compile(Compile.java:66)
... 2 more
Thanks for your update. That line is this one:
https://github.com/jOOQ/jOOR/blob/version-0.9.13/jOOR/src/main/java/org/joor/Compile.java#L66
The only thing that can be null
is compiler
, which is null, according to the ToolProvider.getSystemJavaCompiler()
Javadoc if:
This implementation returns the compiler providedby the jdk.compiler module if that module is available,and null otherwise.
We could throw a better exception than a generic NPE
of course (will fix right away: #108), but you'd still have to make sure a compiler is available at runtime by pulling in the java.compiler
module from the JDK (e.g. it doesn't ship with the JRE)