2014-10-06 65 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);