這是我目前的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hu.elte.inf</groupId>
<artifactId>ThesisMVN</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>main/Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.javatuples</groupId>
<artifactId>javatuples</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
我需要維護我的資源檔案夾(及其子檔案夾)的結構,因為目前將它們從資源檔案夾中取出,所以我的游戲無法啟動,因為它找不到所有紋理。
專案

jar-ed資源結構中的資源結構(注意jar中只有一個effects檔案夾,它把圖片放在類檔案旁邊)

這是我當前加載影像的方式
public class ResourceLoader {
public static Image getResource(String path){
Image img=null;
try{
img = ImageIO.read(new File(path));
}
catch(IOException e) {
System.err.println("File not found(" path ')');
e.printStackTrace();
}
return img;
}
}
傳遞給 getResource的path值是從我設定所有影像路徑的列舉中獲取的,如下所示:
...
BULLET("src/main/resources/bullet.png"),
BULLET_GREY("src/main/resources/bullet_grey.png"),
...
AOE_SLOW("src/main/resources/effects/aoeSlow.png"),
AOE_DISARM("src/main/resources/effects/aoeDisarm.png"),
...
我假設我應該洗掉src/main/resources前綴,但是一旦專案被震動,我就可以訪問影像。
這可能是我設定的不穩定部分,但我目前將每個加載的影像存盤在一個名為GameStateData. 每當我需要創建一個新Sprite的影像時,我都會從那里獲取已經加載的影像,所以我只需要在啟動游戲時加載每個影像一次。
uj5u.com熱心網友回復:
我需要維護資源檔案夾(及其子檔案夾)的結構
它被維護。資源檔案夾中的每個檔案和目錄都已按照標準目錄布局的要求直接復制到 jar 中。
問題在于您的設定:在“開發時間”,您似乎試圖從中加載,resources/items/someItem.png而當您的應用程式受到震動時,這將不起作用。有兩種明顯的方式可以發生這種情況;
你對原因感到困惑
您正在嘗試使用new FileInputStream,new File或以其他方式嘗試將這些作為檔案加載。這是行不通的,也行不通,再多的對目錄結構的玩弄也不會使它起作用。在 java 中,file 表示檔案- jarfile 中的 png 條目本身并不是檔案。
加載此類資源的方法始終是以下策略:
選擇一個作為“源位置”的類——例如,您要查找的資源將在 JVM 找到該類檔案的任何位置。通常,您可以在整個應用程式中選擇任何類;這僅在您使用模塊化類加載系統時才相關。如果您不知道這意味著什么,那么您就沒有使用它們。
呼叫
MyContextClass.class.getResource(resourceKey)以獲取 URL 物件,然后您可以將其傳遞給任何允許您執行此操作的 API(許多 API 都可以,尤其包括 swing 自己的ImageIcon)。或者,使用try (var in = MyContextClass.class.getResourceAsStream(resourceKey) { /* use resource here */ }- 如果所討論的 API 沒有采用 URL 的多載但確實有采用 InputStream 的多載,則使用此方法。如果您想直接閱讀內容,這也是可以使用的。resourceKey有2種口味。There's"foo/bar.png"解決了相對于您的背景關系類所在的確切包的路徑。如果您package com.foo; public class Bar {}在部署中的某個地方有com/foo/Bar.class. 例如,在 jar 檔案或bin目錄中。如果您隨后撰寫Bar.class.getResource("baz/quux.png"),并且 Bar.class 在該 jar 檔案中,那么系統將在同一個 jar 檔案中查找com/foo/baz/quux.png. 或者,包括一個前導斜杠:"/foo/bar.png"將在同一個 jar 中查找,但用于foo/bar.png.這就是你所要做的。構建系統和 IDE 確保您將影像準確地放在您現在擁有它們的位置(在
resources檔案夾中),您不包含resources在您的部署密鑰中(出于同樣的原因,您將 java 源檔案包含在 中,src/main/java/com/foo/MyApp.class并且您不包含src、、、main或java在您的完全限定的類名中。它只是com.foo.MyApp,不是main.java.com.foo.MyApp。theresources不是它的一部分,也不java是您的類名的一部分。如果它不起作用,則說明它們配置錯誤。
你有一個不穩定的設定
有可能您一直在破解,例如使用插件系統,您可以直接在檔案系統上檢查某些檔案,-或- 通過加載ContextClass.class.getResource,或者您一直在弄亂 IDE 的 maven 插件識別資源目錄的方式,或者您一直在手動設定 IDE 專案(而不是使用其 maven 集成)并標記src/main為源目錄(而不是src/main/javaand src/main/resources)。設定壞了;修復它(不要通過試圖保持resources周圍來“修復”它)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468465.html
