Как скомпилировать 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
создать исполняемый файл для класса в текущем рабочем каталоге. Вызов его запускает скомпилированный в натив код этого класса.