2012-08-31 44 views
0

我有一個屬性文件,我已經包含在我將要發佈的jar文件中。之前,我決定把瓶子內的文件我加載它像僅當作爲罐子運行時纔將文件捆綁到jar中

properties.load(new FileInputStream(configFileName)); 

但這停止,一旦文件被放置在罐子裏面工作,所以我改變了代碼,以

properties.load(MyClass.class.getResourceAsStream(configFileName)); 

唯一的問題是我有單元測試使用我的屬性(這是靜態加載,所以我不能嘲笑它)。單元測試在jar生成之前運行,所以現在都失敗了。有沒有一種優雅的方式來處理文件,只有當程序以jar的形式運行時纔會出現在jar文件中?

回答

0

的問題可能是,這個文件是不是你的類加載器可見..

我要是這個應用程序是一個web應用使用這個

Classloader cl = getClass().getClassloader(); 
properties.load(cl.getResourceAsStream(configFileName)) 

要注意你的類加載..你」就會對這種情況下,許多類加載器..你的資源必須是可見的這種類加載器。在他們這樣的工作servlet容器如Tomcat

Bootstrap 
     | 
    System 
     | 
    Common 
    / \ 
Webapp1 Webapp2 ... 

你可以在這裏閱讀更多 http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

1

做到這一點的一種方法是撥打電話getResourceAsStream(),如果它返回空呼叫new FileInputStream()

但一個更好的問題是:爲什麼運行單元測試時,類路徑中的屬性不是?如果您使用的是像Maven這樣的構建工具,那麼這應該是自動的。而且這會讓你更有意識地建立你自己的想法。

+0

感謝您的迴應。你能解釋一下你的意思嗎?把這些屬性放在classpath中,我是java開發新手。我正在使用構建工具,但它是專有的,而不是Maven。 – Manny

+0

如果您使用專有的構建工具,那麼我不知道您會如何執行此操作,除了將您的屬性文件放在與您的代碼相同的目錄中。即使這可能無效。 – parsifal

0

如果你高興有性能隨你的源代碼實時文件然後嘗試:

properties.load(getClass().getResourceAsStream("my.properties")); 

my.properties文件將不得不住在同一個封裝中.java文件在這種情況下。

相關問題