[英]How to export to a runnable jar with Proccessing (Eclipse)
我试图将我的处理小程序从 eclipse 导出到一个可运行的 jar 文件(我正在使用它来编码)并且它成功导出但是当打开时只会导致一个空白(灰色)屏幕。 如果我使用命令提示符运行它,我会收到此错误:
java.lang.NullPointerException:无法调用“String.contains(java.lang.CharSequence)”,因为“jarPath”为空
当我提取 jar 样本时,文件夹和目录似乎也不正确。
之前(依赖项在依赖项文件夹中)
之后(依赖项在现在缺少的依赖项文件夹之外)
我确定这是生成文件结构的问题,更具体地说是依赖关系。 当我将它作为应用程序 eclipse 运行时,它运行得非常好,没有例外。
完整留言:
java.lang.NullPointerException: Cannot invoke "String.contains(java.lang.CharSequence)" because "jarPath" is null at processing.core.PApplet.dataFile(PApplet.java:7673) at processing.core.PApplet.dataPath(PApplet.java:7650) at processing.core.PApplet.createInputRaw(PApplet.java:6741) at processing.core.PApplet.createInput(PApplet.java:6659) at processing.core.PApplet.loadBytes(PApplet.java:6959) at processing.awt.ShimAWT.loadImage(ShimAWT.java:384) at processing.core.PSurfaceNone.loadImage(PSurfaceNone.java:61) at processing.core.PApplet.loadImage(PApplet.java:5311) at processing.core.PApplet.loadImage(PApplet.java:5296) at net.turke1034.shootergame.game.ShooterGame.draw(ShooterGame.java:55) at processing.core.PApplet.handleDraw(PApplet.java:2201) at processing.awt.PSurfaceAWT$10.callDraw(PSurfaceAWT.java:1422) at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:354) java.lang.NullPointerException: Cannot invoke "String.contains(java.lang.CharSequence)" because "jarPath" is null at processing.core.PApplet.dataFile(PApplet.java:7673) at processing.core.PApplet.dataPath(PApplet.java:7650) at processing.core.PApplet.createInputRaw(PApplet.java:6741) at processing.core.PApplet.createInput(PApplet.java:6659) at processing.awt.ShimAWT.loadImageIO(ShimAWT.java:454) at processing.awt.ShimAWT.loadImage(ShimAWT.java:439) at processing.core.PSurfaceNone.loadImage(PSurfaceNone.java:61) at processing.core.PApplet.loadImage(PApplet.java:5311) at processing.core.PApplet.loadImage(PApplet.java:5296) at net.turke1034.shootergame.game.ShooterGame.draw(ShooterGame.java:55) at processing.core.PApplet.handleDraw(PApplet.java:2201) at processing.awt.PSurfaceAWT$10.callDraw(PSurfaceAWT.java:1422) at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:354)
我在一个不需要依赖项的测试项目中尝试了同样的事情,它按预期运行(在命令提示符下运行时)
有同样的问题,所以解决了一段时间,直到我找到以下解决方案。 我假设您正在使用类似于处理项目中的数据文件的数据文件来包含您的依赖项。
在 Eclipse 中,导出为可运行的 jar 并选择“将所需库提取到生成的 JAR”选项。 创建 jar 后,将此 jar 放入一个新文件夹中。 将您的数据文件夹也放入此文件夹。 这对我有用。
不知道为什么会这样 - 只是把东西扔到墙上直到卡住。 我使用的一种故障排除技术是在加载任何数据之前制作打印机,这样我就可以看到计算机在哪里搜索依赖项。 下面的代码段将文件输出到处理查找数据的同一位置。
PrintWriter pw = createWriter(dataPath("test.txt"));
pw.print("over here");
pw.close();
我将它与 dataPath("") 结合使用,发现它正在寻找 jar 之外的依赖项。
过去( 这里的旧答案)我成功地从 eclipse 导出了可运行的 .jar 项目,这些项目使用处理的库,方法是使用将所需的库复制到可运行Jar 文件导出选项中生成的 jar 选项旁边的子文件夹中:
这使得调试 java 类路径问题(从命令行运行时的-cp
标志)和本机库路径( -D.java.library.path
命令行标志)更容易。
如果您使用的是 java 包,请记住在PApplet.main()
中指定它们:
public static void main(String[] args) {
PApplet.main(ShooterGame.class.getCannonicalName());
}
仅当由于缺少库(找不到类,缺少本机库等)而无法执行 jar 文件时,上述内容才有用
关于加载外部资产,正如 Shivoum B 所提到的,您可以使用dataPath()
也可以使用sketchPath() 。(参见这个类似的答案)。 在没有看到您正在调用的loadImage()
调用的路径的情况下,我只能做出假设,但您可能能够在 ShooterGame.java 中摆脱类似的情况:
loadImage(sketchPath("data" + File.separator + "yourImageName.png");
(题外话,如果我没看错,你正试图在draw()
中加载图像?我建议在setup()
中加载所有资产一次,而不是在draw()
中多次加载。特殊情况可能是加载需要时间的大型资产并使用P2D
或P3D
,其中 OpenGL 上下文设置可能会超时(您可以在其中加载draw()
但应使用“去抖动”布尔值以确保仅加载一次资产)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.