graalvm / graal-js-jdk11-maven-demo

An example project how to run Graal/JavaScript on JDK 11 with Graal as optimizing JIT compiler for best performance.
Universal Permissive License v1.0
177 stars 63 forks source link

Maven example with standalone jar #18

Open dschow opened 5 years ago

dschow commented 5 years ago

I'm wondering if it's possible to information on how to include the dependencies required to run this sample with a standalone jar.

boris-spas commented 5 years ago

If what you want to achieve is to have one single jar you can run, that's not really possible if you want to have compilation enabled with graal, since you need to update the module path.

adveres commented 4 years ago

Very curious about this, too. Why can exec-maven-plugin do what we cannot do with java -jar ?

Taking this project as an example, mvn -X exec:exec shows:

[DEBUG] Executing command line: [/Users/averes/.jabba/jdk/openjdk@1.11.0-2/Contents/Home/bin/java, @target/modulepath, 
-classpath, /Users/averes/dev/graal-js-jdk11-maven-demo/target/classes:/Users/averes/.m2/repository/org/graalvm/sdk/graal-sdk/19.3.1/graal-sdk-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/js/js/19.3.1/js-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/regex/regex/19.3.1/regex-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/truffle/truffle-api/19.3.1/truffle-api-19.3.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm/7.1/asm-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-tree/7.1/asm-tree-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-analysis/7.1/asm-analysis-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-commons/7.1/asm-commons-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-util/7.1/asm-util-7.1.jar:/Users/averes/.m2/repository/com/ibm/icu/icu4j/64.2/icu4j-64.2.jar:/Users/averes/.m2/repository/org/graalvm/js/js-scriptengine/19.3.1/js-scriptengine-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/tools/profiler/19.3.1/profiler-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/tools/chromeinspector/19.3.1/chromeinspector-19.3.1.jar, 
-XX:+UnlockExperimentalVMOptions, 
-XX:+EnableJVMCI, 
--upgrade-module-path=/Users/averes/dev/graal-js-jdk11-maven-demo/target/compiler/compiler.jar, com.mycompany.app.App]

So why can't I do

java -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI --upgrade-module-path=/Users/averes/dev/graal-js-jdk11-maven-demo/target/compiler/compiler.jar -jar target/my-app-1.0-SNAPSHOT.jar

Error occurred during initialization of boot layer
java.lang.module.FindException: Module org.graalvm.truffle not found, required by jdk.internal.vm.compiler

Or (basically identical to the maven exec):

java @target/modulepath -classpath /Users/averes/dev/graal-js-jdk11-maven-demo/target/classes:/Users/averes/.m2/repository/org/graalvm/sdk/graal-sdk/19.3.1/graal-sdk-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/js/js/19.3.1/js-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/regex/regex/19.3.1/regex-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/truffle/truffle-api/19.3.1/truffle-api-19.3.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm/7.1/asm-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-tree/7.1/asm-tree-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-analysis/7.1/asm-analysis-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-commons/7.1/asm-commons-7.1.jar:/Users/averes/.m2/repository/org/ow2/asm/asm-util/7.1/asm-util-7.1.jar:/Users/averes/.m2/repository/com/ibm/icu/icu4j/64.2/icu4j-64.2.jar:/Users/averes/.m2/repository/org/graalvm/js/js-scriptengine/19.3.1/js-scriptengine-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/tools/profiler/19.3.1/profiler-19.3.1.jar:/Users/averes/.m2/repository/org/graalvm/tools/chromeinspector/19.3.1/chromeinspector-19.3.1.jar -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI --upgrade-module-path=/Users/averes/dev/graal-js-jdk11-maven-demo/target/compiler/compiler.jar -jar target/my-app-1.0-SNAPSHOT.jar
no main manifest attribute, in target/my-app-1.0-SNAPSHOT.jar

Is there something simple I am missing? Thank you!

boris-spas commented 4 years ago

I'm not quite sure what you are asking but I'll take a crack and answering what I think you are asking so please let me know if I'm missing the mark.

The first example you gave cannot work since target/my-app-1.0-SNAPSHOT.jar does not contain any of the dependencies. If you managed to build a correct fat jar (including all the dependencies and ensuring the module path is correctly set up) than you may be able to do this.

The problem with your second example (also with the first one) is that the built jar does not have a proper manifest to be executed with -jar (https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute)

adveres commented 4 years ago

Thank you for checking in!

Let me add some clarity for my use-case. I'm trying to run a fat Spring Boot JAR in Docker, which can run some JavaScript too. Today java is OpenJDK 11.0.2.

CMD java -jar /opt/foo/mySpringBoot.jar

I did end up getting a new stacktrace when I used Context instead of ScriptEngine, which appears to be this issue: https://github.com/oracle/graal/issues/1348

So perhaps I just need to wait for the next release.

Example + trace

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        try(Context context = Context.newBuilder("js").build()) {
            context.eval("js", "print('Hello from JS!');");
        }

        SpringApplication.run(Application.class, args);
    }
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: java.nio.file.FileSystemNotFoundException
    at jdk.zipfs/jdk.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:169)
    at jdk.zipfs/jdk.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:155)
    at java.base/java.nio.file.Path.of(Path.java:208)
    at java.base/java.nio.file.Paths.get(Paths.java:97)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.LanguageCache$Loader.getLanguageHomeFromURLConnection(LanguageCache.java:546)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.LanguageCache$Loader$ServicesLoader.loadImpl(LanguageCache.java:827)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.LanguageCache$Loader.load(LanguageCache.java:490)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.LanguageCache.createLanguages(LanguageCache.java:205)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.LanguageCache.loadLanguages(LanguageCache.java:195)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.LanguageCache.languages(LanguageCache.java:185)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotEngineImpl.initializeLanguages(PolyglotEngineImpl.java:647)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotEngineImpl.<init>(PolyglotEngineImpl.java:205)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotEngineImpl.<init>(PolyglotEngineImpl.java:186)
    at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotImpl.buildEngine(PolyglotImpl.java:195)
    at org.graalvm.sdk/org.graalvm.polyglot.Engine$Builder.build(Engine.java:506)
    at org.graalvm.sdk/org.graalvm.polyglot.Context$Builder.build(Context.java:1444)
    at net.myspring.server.Application.main(Application.java:34)
    ... 8 more