6

jar我从我创建了一个Java project并想在JSP Servlet Project. 我正在尝试加载一个属性文件,比如说我JSP Servlet Project保存的sample.propertiesWEB/properties/sample.properties应该由jar.Im 中的一个类读取。我使用下面的代码写在一个 jar 类中来访问它。

Properties prop=new Properties();
prop.load(/WEB-INF/properties/sample.properties);

但每次我得到fileNotFound exception.
请建议我解决方案。

这是结构

WEB-INF
      |
       lib
          |
           myproject.jar
                       |
                        myclass (This class needs to read sample.properties)
      |
       properties
                 |sample.properties
4

5 回答 5

21

/WEB-INF文件夹不是类路径的一部分。因此,这里任何不经思考的建议ClassLoader#getResourceAsStream()都将永远不会奏效。只有将属性文件放置在/WEB-INF/classes其中确实是类路径的一部分时,它才会起作用(在像 Eclipse 这样的 IDE 中,只需将其放置在 Java 源文件夹根目录中就足够了)。

如果属性文件确实存在于您想要保留的位置,那么您应该将其作为 Web 内容资源获取ServletContext#getResourceAsStream()

假设你在 a 里面HttpServlet,应该这样做:

properties.load(getServletContext().getResourceAsStream("/WEB-INF/properties/sample.properties"));

getServletContext()继承自servlet超类,不需要自己实现;所以代码原样)

但是,如果该类本身根本不是 a HttpServlet,那么您确实需要将属性文件移动到类路径中。

也可以看看:

于 2012-09-21T02:13:48.520 回答
6

尝试将 sample.properties 放在src文件夹下,然后

Properties prop = new Properties();
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myprop.properties"));
于 2012-09-20T06:22:00.667 回答
2

将您的属性文件移动到WEB-INF/classes. 然后加载如下:

prop.load(getClass().getResourceAsStream("sample.properties"));

你也可以把它放到子目录下classes。在这种情况下,相应地更改调用getResourceAsStream()

为了在多类加载器系统中更安全,您可以Thread.getContextClassLoader().getResourceAsStream()改用它。

要使属性文件到达classes您的 war 文件的文件夹,您必须将其放在resources项目中的文件夹下(如果您使用的是 maven),或者src如果您不使用类似 maven 的目录结构,则只需放在文件夹下。

于 2012-09-20T06:27:11.013 回答
1

试试这个,

 InputStream inStream = Thread.currentThread().getContextClassLoader()
                     .getResourceAsStream("/WEB-INF/properties/sample.properties");

然后,将其加载(InputStream)到一个 Properties 对象中:

Properties props = new Properties();
props.load(inStream);
于 2012-09-20T06:23:38.910 回答
0

如果您尝试从 jsp/servlet 加载属性,它可能不起作用。编写一个实用程序类来读取属性和包以及 jar 文件。将属性文件复制到与实用程序相同的包中。

 Class Utility{
    Properties properties=null;
    public void load() throws IOException{
        properties.load(getClass().getResourceAsStream("sample.properties"));
    }
    public Object get(String key) throws IOException{
        if (properties==null){
            load();
        }
        return properties.get(key); 
    }
  }

现在使用 servlet 中的这个实用程序类来读取属性值。也许您可以将类定义为单例以便更好地练习

干杯萨西什

于 2012-09-21T06:50:37.863 回答