调用java属性文件时应该使用哪条路径?

时间:2013-05-01 21:37:23

标签: java properties classpath relative-path

基本上我用我的方式建立了项目模型:

ModelFolder
-----的 SRC
----- bin等
-----的 PropertiesFolder1
-------- File1.properties
-------- File2.properties等
-----的 PropertiesFolder2
-------- File1.properties
-------- File2.properties等
----- MainPropertiesFile1.properties
----- MainPropertiesFile2.properties

我正在尝试将它与我的View一起使用,这是一个动态Web项目,我在更改后获得了最终加载到我的Web项目中的属性文件

foo.load(new FileInputStream("foo.properties"));  

foo.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("foo.properties"));

并将项目导出到JAR文件,然后将其包含在WEB-INF / lib中。但是,我不得不向Model添加另一个方法,当我尝试测试该方法时,Model无法读取我的属性文件。我知道我可以使用FileInputStream和完整路径来获取在Model和View中工作的属性文件,但有没有其他选择?

每次切换计算机时,我都不想继续更改完整路径(我在工作中使用H:\ username \ ... \ Java \ Workspace,而在家里它只是C:\ Java \工作区)
我也不想将我的属性文件移动到不同的文件夹;最后我不想改变每次测试模型或视图时加载属性文件的方式。
有没有办法实现这个目标?

这让我发疯,我已经尝试了以下所有方法:

try 
    {
         foo.load(this.getClass().getResourceAsStream("foo.properties"));
        //foo.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("foo.properties"));
        //foo.getClass().getResourceAsStream("foo.properties");
        //foo.load(new FileInputStream("foo.properties"));

    } catch (IOException ex)
      {
          al.logIntoProgrammerLog(ex);
      }  

所有这些行都可以在模型或视图中使用。有没有办法可以通过模型中的相对路径调用这些属性文件,然后以某种方式将模型与视图正确连接,以便找到并加载所有文件? 任何帮助将不胜感激;我是Java新手,所以我可能会遗漏一些非常简单的东西。谢谢。

编辑:
很抱歉没有澄清这一点,Model是一个Java项目,而View是一个在本地Tomcat Server v6.0上运行的动态Web项目。

更好(我希望)解释:

My View有一个带有以下doPost方法的LoginServlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
   String username = request.getParameter("usernameField");
   String password = request.getParameter("passwordField");
   ActivityLogger al = new ActivityLogger();

   LoginController l_c = new LoginController();

   //loginUser method will call my UserStorage class and 
   //will return true if UserStorage finds the User with those credentials in the db
   //UserStorage is using a prepared sql statement stored in a properties file to find the User
   //That properties file is not being read unless I specify the full path to it.
   //Both Login and UserStorage are in the Model
   if(l_c.loginUser(username, password))
   {
      //take user to welcome page
   }
   else
      //display error
}

再次感谢

2 个答案:

答案 0 :(得分:2)

请查看此thread,了解共享.properties文件的可能解决方案。但我建议您查看这种方法,看看它是否真的是您想要的。更具体地说,如果您的.properties文件包含SQL查询,那么您确定在View中需要它吗?听起来你可能想在那里做一个干净的分离。

答案 1 :(得分:1)

如果您在Web应用程序中,则应该能够通过使用ServletContext的getResourceAsStream()获取路径(webapp上下文中的相对路径,因此它可以在任何计算机上运行)。例如,如果您想从servlet的doGet()方法获取路径:

public void doGet(HttpServletRequest request, HttpServletResponse response) {
  InputStream in = getServletContext().getResourceAsStream(<path>);
}
  • 其中<path>将是.properties文件的相对路径(即/WEB-INF/foo.properties,或者该属性文件所在的位置...查看部署文件夹以确定)

但是在重新阅读你的帖子时,似乎你的“模特”不是一个webapp而你的“View”是一个webapp?也许您可以澄清这些是否是两个不同的应用程序 - 可能一个是在servlet容器中运行的webapp(即Tomcat,Glassfish等),另一个是独立的应用程序?如果是这种情况,那么这更像是一个共享文件问题,而不是“无法找到资源”问题。关于应用程序性质的一些澄清将有助于引导正确的响应......