2012-03-08 60 views
0

這是裝載資源從一個jar文件中衆所周知的問題。這不是我第一次嘗試這樣做,但現在它不像我預期的那樣工作。資源裝載在Java中不能正常工作,因爲它應該

通常我嘗試將資源與this.getClass.getResource("foo.png"),或getResourceAsStream()加載和它的作品。但現在它沒有。資源始終爲空。

如果我讓System.out.println(this.getClass.getResource(""))打印出路徑(來自eclipse),它會顯示/path/to/eclipseproject/package/structure/。從JAR運行這個它只是顯示rsrc:package/structure

如果我沒有記錯這應該打印路徑罐子。此外,我認爲這會在兩種情況下打印包裝結構。難道我做錯了什麼?

回答

2

這裏是東西...

在提取從使用JAR文件:

this.getClass.getResource("/foo.png") 

當從運行的JAR使用運行,在罐子文件夾路徑引用外部文件:

this.getClass.getResource("foo.png") 
// When running this from Eclipse, it would refer to files in project root! 

我有一個代碼在較低的水平,確定我從哪裏跑來確定正確的路徑。

+0

謝謝。這工作。我意外地檢查了'將所需的庫包裝到生成的jar包中,導致資源說'rsrc' – Simiil 2012-03-14 12:04:49

0

李四這個獲取路徑你需要什麼?

this.getClass().getClassLoader().getResource("<your class name>.class").getPath(); 

另請參閱this question有關此問題的更多信息。

0

除非預先用'/'指定資源的路徑,否則Class.getResource()將搜索類包中的資源。例如:tld.domain.Foo.class.getResource(「Bar.txt」)將搜索tld/domain/Bar.txt

0

檢查URLClassLoader是否所有的血腥細節,但這取決於您是否嘗試訪問的ressource在罐子裏,

  • 使用相同的罐內裝載的類,在這種情況下,你的文件「根」是使用一類的jar

  • 的罐子外裝根(你的月食案例),其中根是你的'工作目錄'

要訪問的資源一個罐子裏,從外面,你應該使用類似

URL url = new URL("jar", "", "file:" + jar.getCanonicalPath() + "!/" + localPathResource); url.openStream(...)

0

answer提供瞭如何從JAR文件加載類的資源,甚至上課的時候不解釋JAR文件,而不是在JAR文件清單中指定的Class-Path。也有代碼鏈接。

相關問題