To work with GraalVM, developers first need to port a JVM application. They have to describe their application’s runtime behavior – dynamically linked libraries, reflection, proxies, etc., in configuration files. If you fail to define these behaviors correctly, your application will fail at runtime.
This process is challenging because JVM developers tend to use tons of third-party libraries they only understand superficially. This modularity (i.e., reusing a jar without reading the source code) is a strength of Java’s. However, these libraries usually express the dynamic behavior (i.e., using reflection or proxies) that makes it hard to describe the runtime behavior.
Therefore, the JVM is at odds with GraalVM; through modularity, Java gives you a lot of abstractive power, but the GraalVM Native Image makes you remove it. GraalVM Native Image is a wonderful tool, but it also breaks the JVM model.
Despite these challenges, we think GraalVM is an incredible tool. So, we created Magicator to make GraalVM more accessible to developers worldwide. Check it out!