我有一个研究项目(在Java 8中实现),它将在Eclipse中提供多个类,几个主要功能以及10000行以上的代码。输入不小的程序会耗尽内存。
如果要编译为本机应用程序,我想看看它是否会使用更少的堆栈内存。
我发现在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”,该文件是可执行文件(应用程序/ x可执行文件)。
我可以从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或其他任何技术。
针对BoriS的回答:
几个小时前,我尝试制作一个罐子,并制作了一个名为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
当我运行可执行(应用程序/ x-可执行文件)类型的Main时,我得到了
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
答案 0 :(得分:0)
文档(https://www.graalvm.org/docs/reference-manual/aot-compilation/)中的两个选项:
1)构建一个jar项目,并以此为基础构建本地图像
native-image [options] -jar jarfile
为jar文件构建图像。
2)正确设置本地图像类路径,并为本地图像提供所需的主图像
您可以为本机映像构建提供其他选项:
-cp
和--class-path
帮助通过单独的目录列表,JAR存档和ZIP存档搜索类文件;
native-image [options] class
为当前工作目录中的类构建可执行文件。调用它会执行该类的本机编译代码。