为什么"GLProfile.GetDefault()"在 NetBeans 中运行时有效,而在运行 Jar 时不起作用



我正在制作一个简单的窗口,使用Java OpenGL库(jogamp)最新的稳定版本2.2.4渲染一个移动的三角形,我已经设置好了一切,就像我在JOGL网站上找到的教程一样,问题是当在Netbeans上运行这段代码时,它运行得很好,GetDefault()方法可以获得我的系统OpenGL版本,窗口渲染和动画。问题是,当我构建项目时,我确保所有的Jar和.dll文件都在/dist文件夹中,并使用"java-Jar-name.Jar"执行Jar。我得到以下错误消息:

Exception in thread "main" javax.media.opengl.GLException: Profile GL_DEFAULT is not 
available on null, but: []
    at javax.media.opengl.GLProfile.get(GLProfile.java:962)
    at javax.media.opengl.GLProfile.getDefault(GLProfile.java:693)
    at javax.media.opengl.GLProfile.getDefault(GLProfile.java:704)
    at cl.lucas.clases.Main.main(Main.java:14)

这是我的主类代码:

import com.jogamp.opengl.util.FPSAnimator;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
public class Main {
    public static void main(String[] args) {
        GLProfile glp = GLProfile.getDefault();
        GLCapabilities caps = new GLCapabilities(glp);
        GLCanvas canvas = new GLCanvas(caps);
        Frame frame = new Frame("AWT Window Test");
        frame.setSize(300, 300);
        frame.add(canvas);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        canvas.addGLEventListener(new EscenaSimple());
        FPSAnimator animator = new FPSAnimator(canvas, 60);
        animator.start();
    }
}

为什么它只能在IDE上工作而不能在外部工作,我运行的是Windows7,我也试过在Eclipse上运行这个程序,没有问题,问题是jar可执行文件,也许我错过了什么。

您的胖JAR可能是不完整的,我的JAR在GNULinux、OSX和Windows下可以完美工作。您必须遵循这个布局,您可以在Eclipse中使用这个Ant脚本使其工作。我的详细说明在这里,即使你只使用JogAmp而没有我的教程中提到的引擎,它们也能工作。

许多开发人员已经问了我们很多关于胖JAR的问题,请在我们的官方论坛上联系我们。您不需要将本机库(Windows下的DLL)放在特定目录中,只有当您不使用包含本机库的JAR时,才有必要设置Java库路径,只需启用自动本机库加载(默认情况下处于启用状态),GlueGen将检测您的体系结构,提取适当的本机库,(用于JOGL、JOAL和JOCL)并加载它们。

如果您真的想使用"-jar"选项,那么您的jar必须包含应用程序运行所需的全部内容,并且位于预期位置。仔细阅读我教程中的段落,您必须至少设置manifest属性"Main Class"才能使其正常工作,这样Java才能找到应用程序的主要入口点。

最新更新