jOOQ/jOOR

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)