[英]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.