java - 使用 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 中的任何消息。
解决方案
推荐阅读
- linux - RHEL 7.4 中的 git 升级
- excel - VBA - 为什么从 Excel 打开 Word 很慢?
- firebase - 如何使用网站将身份验证令牌返回给谷歌助手?
- c# - 在 WPF 中显示系统时间:调度程序计时器
- python - Python 中的一个程序,它以小写且不带换行符的形式打印字母 - 除了 q 和 e
- javascript - AJAX 和 Facebook API
- ipython - ImportError:没有名为“pvlib”的模块
- mysql - 从表 1 中获取所有值并从表 2 中获取一个字段的值
- java - JOptionPane 输入后关闭,但应打开第二个输入对话框
- ios - 如何从反应原生页面快速打开现有的 ViewController?