2014-10-06 47 views
0

我想從我的Web應用程序(簡單的Servlet應用程序)調用JAR文件中存在的方法。下面是方法是使用訪問屬性的代碼文件:在web應用程序中找不到屬性文件

InputStream inputStream = 
      ClassLoader.getSystemClassLoader() 
         .getResourceAsStream("demo.properties"); 

properties.load(inputStream); 

當使用我的Web應用程序調用此方法,我得到這個NullPointerException

java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Unknown Source) 
    at java.util.Properties.load0(Unknown Source) 
    at java.util.Properties.load(Unknown Source) 

可能的原因的例外是:我的Web應用程序無法找到demo.properties文件,因此inputStreamNULL,並引發此異常。

請讓我知道:

  1. 如何解決這個例外。

  2. 我是否需要將屬性文件手動放入我的基於Web的應用程序中?如果是,那麼究竟在哪裏放置此demo.properties文件在我的Web應用程序中以解決此異常。

+0

哪裏'demo.properties'目前放在罐子裏? – 2014-10-06 14:41:12

+2

'src'文件夾是一個項目文件夾。生成的'.jar'文件在哪裏? – 2014-10-06 14:42:13

+0

它位於'root'目錄下。如果我使用反編譯器打開'jar',那麼我可以在根目錄中看到它(即,不在任何包中) – user182944 2014-10-06 14:44:26

回答

2

系統類加載器只知道核心Java庫,例如,在java.lang中的那些庫。 ,java.util。

你想使用相同的類加載器加載屬性文件,該加載器查看該JAR文件,這可能是加載類的相同類加載器。

嘗試這樣:

public class PropertyFileTest { 
    public void loadProperties() { 
     InputStream inputStream = PropertyFileTest.class.getResourceAsStream("/demo.properties"); 

     properties.load(inputStream); 
     // do something with properties to see if it worked or not. 
    } 
} 

請注意,我用Class.getResourceAsStream,將使用該類的類加載器爲你,每:

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

+0

我能從您的評論中理解的是:我的Web應用程序使用'.class.getResourceAsStream'加載器來加載jar中存在的類文件,因此jar文件也應該使用相同的類來加載屬性欄 - 正確嗎? – user182944 2014-10-06 15:40:05

+0

我在說加載你的類的類加載器應該是可以加載屬性文件的相同的類加載器。系統類加載器對你的JAR文件一無所知,因此對你的類或屬性文件一無所知。 – Brandon 2014-10-06 15:42:24

+0

我相信我很困惑!我正在從jar文件訪問'properties'文件。我的Web應用程序通過調用jar文件方法來訪問jar文件(我沒有直接在web應用程序中調用屬性文件,而是使用jar文件本身調用它)。 – user182944 2014-10-06 15:44:36

2

的類加載器interprete傳遞的字符串作爲絕對路徑,因此,就好像它是/demo.properties(但從未使用標題斜槓ClassLoader.getResource)。因此打開戰爭並尋找/WEB-INF/classes/demo.properties。這必須區分大小寫。

你可能(一般)的替代品有興趣:

  • MyServletClass.class.getResourceAsStream("/demo.properties") - 更好;
  • ResourceBundle bundle = ResourceBundle.get("demo");
  • 使用Servlet的初始化參數/WEB-INF/web.xml
+0

@SotiriosDelimanolis我試圖用「就好像它是「和」但從不使用ClassLoader的標題斜槓「。 – 2014-10-06 14:52:28

+0

在這種情況下,您可以執行'SomeJarClass.class.getResourceAsStream(「/ demo.properties」)'。區別在於ClassLoader在類加載器的某個層次結構中搜索類路徑(幾個jar),而使用該類直接處理一個jar,更直接。 – 2014-10-06 15:26:09

+0

好吧,這意味着你要求我改變我當前訪問Jar文件中屬性文件的方式。我需要使用'ClassName.class.getResourceAsStream'方法,而不是使用'ClassLoader.getSystemClassLoader().getResourceAsStream'方法嗎?請確認我是否正確地得到你。 – user182944 2014-10-06 15:31:09

-1

的ClassLoader並不確定哪屬性文件位置。

使用此代碼:

String path = AbcServiceImpl.class.getClassLoader().getResource("abc.properties").getFile().toString(); 
path = path.replace("%20", " "); 
File f = new File(path); 
相關問題