Как скомпилировать Java в Native с использованием GraalVM (SubstrateVM) в Eclipse

У меня есть исследовательский проект (реализованный в Java 8), в котором будут несколько классов, несколько основных функций и более 10000 строк кода в Eclipse. Программа не хватает памяти, когда вход не маленький.

Я хотел посмотреть, будет ли он использовать меньше стековой памяти, если он будет скомпилирован как собственное приложение.

Я не нашел способа сделать это в Eclipse.

я сделал
$GRAALVM_HOME/bin/javac /home/appu/Downloads/2019/June/20/HelloWorld.java
Это сработало. Я получил рабочий двоичный файл.

Я пытался
/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
я получил Main entry point class '/home/appu/eclipse-nimi/NimishaGraalEE19/bin/nimi/decimate/Decimate.class' not found.

Я пытался
/home/appu/Downloads/Apps/GraalVM/2019-06-20/graalvm-ee-19.0.2/bin/native-image /home/appu/eclipse-nimi/NimishaGraalEE19/bin/*
я получил Main entry point class '/home/appu/eclipse-nimi/NimishaGraalEE19/bin/nimi' not found.

Классический

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

компилируется в "HelloWorld.class"

который дает исполняемый "helloworld", который является исполняемым (application/x-executeable).

Могу ли я получить то же самое от Eclipse? Могу ли я получить то же самое из командной строки для файлов мультикласса?

Когда я изменяю приведенный выше код в

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

и добавить еще один класс

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

Они правильно компилируются, но я получаю

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

Мне нужен исполняемый файл (в моем случае исполняемый файл Gnu/Linux), который можно использовать как собственный исполняемый файл.

Я предпочитаю решение от Eclipse, но Командная строка, Netbeans, VS Code, ... или любая другая техника приветствуется.


В ответ на ответ Борис:

Я попытался сделать банку несколько часов назад и сделал файл под названием Main. Это не работает.

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

Когда я запустил Main, который является исполняемым (application / x-исполняемый) тип, я получил

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

1 ответ

Решение

Два варианта из документов ( https://www.graalvm.org/docs/reference-manual/aot-compilation/):

1) Создайте флягу своего проекта и создайте из этого нативный образ

native-image [options] -jar jarfile построить изображение для файла JAR.

2) Правильно установите путь к классу родного изображения и укажите родное изображение как основное

Вы можете предоставить дополнительные параметры для создания собственного изображения: -cp а также --class-path помощь в поиске файлов классов через отдельный список каталогов, JAR-архивов и ZIP-архивов;

native-image [options] class создать исполняемый файл для класса в текущем рабочем каталоге. Вызов его запускает скомпилированный в натив код этого класса.

Другие вопросы по тегам