首页 > 解决方案 > 使用 Packr 将 LibGDX 程序打包为 exe 会破坏打开 URL 流的代码

问题描述

在我的 LibGDX 程序中,我尝试从https://api.ipify.org获取用户的 IP 。当我直接运行 jarfile 时,它​​按预期工作,但是当我运行 Packr 生成的 exe 时它会中断。

我用 JDK 11.0.1 编译了 jar,并尝试将它与 JDK 11 和 12 捆绑在一起。因为 JDK 11 和 12 不包含 Packr 查找的 jre 文件夹,所以我手动创建了它并将 bin 和 lib 复制到其中。这是我给 Packr 的配置 json:

{
    "platform": "windows64",
    "jdk": "C:\\Program Files\\Java\\jdk-12",
    "executable": "ShengJi-win64",
    "classpath": [
        "desktop-1.0.jar"
    ],
    "removelibs": [
        "desktop-1.0.jar"
    ],
    "mainclass": "com.sage.shengji.desktop.DesktopLauncher",
    "minimizejre": "soft",
    "output": "out-windows64"
}

此代码在我的 Screen 的 show() 方法中运行。

           try {
               System.out.println("In beginning of try");
               String thisMachineIP =
                        new BufferedReader(
                                new InputStreamReader(
                                        new URL("https://api.ipify.org").openStream())).readLine();
               System.out.println("Retrieved this machine IP");
           } catch(IOException e) {
               e.printStackTrace();
           } catch(Exception e) {
               e.printStackTrace();
           }

当我运行 exe 并打印到日志文件时,它只打印“尝试开始时”并且窗口关闭。它不会因“程序已停止工作”而崩溃;窗口只是关闭,没有任何解释。日志文件不包含任何一个捕获的打印。当我直接运行 jarfile 时,一切都按预期工作。

编辑我尝试改用 LibGDX 的 HTTP 方法:

            Net.HttpRequest httpGet = new Net.HttpRequest(Net.HttpMethods.GET);
            System.out.println("After httpGet object creation");
            httpGet.setUrl("https://api.ipify.org");
            System.out.println("After set httpGet url");

            Gdx.net.sendHttpRequest(httpGet, new Net.HttpResponseListener() {
                @Override
                public void handleHttpResponse(Net.HttpResponse httpResponse) {
                    System.out.println("in handleHttpResponse()");
                }

                @Override
                public void failed(Throwable t) {
                    System.out.println("in failed()");
                }

                @Override
                public void cancelled() {
                    System.out.println("in cancelled()");
                }
            });
            System.out.println("After Gdx.net.sendHttpRequest()");

再一次,jarfile 本身运行良好。exe 从不打印“After Gdx.net.sendHttpRequest()”,也不会打印 HttpResponseListener 中的任何消息。

标签: javalibgdxpackr

解决方案


推荐阅读