4 votes

Comment compiler Java en natif en utilisant GraalVM (SubstrateVM) dans Eclipse

J'ai un projet de recherche (implémenté en Java 8) qui comprend plusieurs classes, plusieurs fonctions principales et bien plus de 10000 lignes de code, dans Eclipse. Le programme manque de mémoire lorsque l'entrée n'est pas petite.

Je voulais voir s'il utilisait moins de mémoire Stack, s'il était compilé comme une application native.

Je n'ai trouvé aucun moyen de le faire dans Eclipse.

Je l'ai fait.
$GRAALVM_HOME/bin/javac /home/appu/Downloads/2019/June/20/HelloWorld.java
Ça a marché. J'ai un binaire qui fonctionne.

J'ai essayé
/home/appu/Downloads/Apps/GraalVM/2019-06-20/graalvm-ee-19.0.2/bin/native-image /home/appu/eclipse-nimi/NimishaGraalEE19/bin/nimi/decimate/Decimate.class
J'ai Main entry point class '/home/appu/eclipse-nimi/NimishaGraalEE19/bin/nimi/decimate/Decimate.class' not found.

J'ai essayé
/home/appu/Downloads/Apps/GraalVM/2019-06-20/graalvm-ee-19.0.2/bin/native-image /home/appu/eclipse-nimi/NimishaGraalEE19/bin/*
J'ai Main entry point class '/home/appu/eclipse-nimi/NimishaGraalEE19/bin/nimi' not found.

Le classique

public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.println("Hello, World!");
    }
}

est compilé dans "HelloWorld.class"

ce qui donne un exécutable "helloworld" qui est exécutable (application/x-executable).

Puis-je avoir la même chose, à partir d'Eclipse ? Puis-je avoir la même chose en ligne de commande, pour les fichiers multiclasses ?

Lorsque je change le code ci-dessus en

public class HelloWorld
{
    public static void hello()
    {
        System.out.println("Hello, World!");
    }
}

et ajouter une autre classe

public class Main
{
    public static void main(String[] args)
    {
        HelloWorld.hello();
    }
}

Ils compilent correctement, mais j'obtiens

appu[23]/home/appu/Downloads/Apps/GraalVM/2019-06-20/graalvm-ee-19.0.2/bin/native-image /home/appu/Downloads/2019/June/23/HelloWorld.class 
Build on Server(pid: 17223, port: 36631)                                                          
[/home/appu/downloads/2019/june/23/helloworld.class:17223]    classlist:     415.66 ms            
Error: Main entry point class '/home/appu/Downloads/2019/June/23/HelloWorld.class' not found.     
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception             
Error: Image build request failed with exit status 1                                              
appu[23]ls                                                                                        
HelloWorld.class  HelloWorld.java  Main.class  Main.java

Ce que je veux, c'est un fichier exécutable (dans mon cas, un exécutable Gnu/Linux) qui peut être utilisé comme un exécutable natif.

Je préfère une solution à partir d'Eclipse, mais la ligne de commande, Netbeans, VS Code, ... ou toute autre technique est la bienvenue.


En réponse à la réponse de BoriS :

J'ai essayé de créer un jar il y a quelques heures, et j'ai créé un fichier appelé Main. Cela n'a pas fonctionné.

jar cfe Main.jar Main Main.class
/home/appu/Downloads/Apps/GraalVM/2019-06-20/graalvm-ee-19.0.2/bin/native-image -jar /home/appu/Downloads/2019/June/23/Main.jar
./Main

Lorsque j'ai exécuté Main qui est de type exécutable (application/x-exécutable), j'ai obtenu

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
        at Main.main(Main.java:5)
Caused by: java.lang.ClassNotFoundException: HelloWorld
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

4voto

BoriS Points 107

Deux options de la documentation ( https://www.graalvm.org/docs/reference-manual/aot-compilation/ ) :

1) Créez un jar de votre projet et créez une image native à partir de celui-ci.

native-image [options] -jar jarfile pour construire une image pour un fichier jar.

2) Définissez correctement le classpath de l'image native et donnez à l'image native le main que vous voulez

Vous pouvez fournir des options supplémentaires à la construction de l'image native : -cp y --class-path aide à la recherche de fichiers de classe à travers une liste séparée de répertoires, d'archives JAR et d'archives ZIP ;

native-image [options] class pour construire un fichier exécutable pour une classe dans le répertoire de travail actuel. En l'invoquant, on exécute le code compilé en mode natif de cette classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X