servlet如何获取servlet外部文件的绝对路径?

时间:2009-02-17 20:06:15

标签: java tomcat servlets filepath os-agnostic

我们一直在使用System.getProperties(“user.dir”)来获取属性文件的位置。现在它已经部署在Tomcat上(通过servlet),系统调用将位置设置为tomcat而不是属性文件所在的位置。

我们如何动态调用属性文件?

假设:

  • Tomcat不是应用程序的唯一方式 将部署
  • 我们无法控制应用的位置 可以放置。
  • 相对路径无法正常工作 正在使用Vista并且Vista会中断 相对路径。
  • 这必须适用于所有操作系统, 包括(但不限于)Linux, XP和Vista。
  • 编辑我暗示这一点,但如果我不够清楚,我没办法 知道路径字符串。

9 个答案:

答案 0 :(得分:2)

查看ServletContext的{​​{3}}和getResource方法。

答案 1 :(得分:2)

您必须知道属性文件的路径,然后将其包装在File中并传递给属性对象的load()方法。

如果您在Tomcat服务中运行,则表明您未按其安装的用户身份运行,因此无法派生主目录。你很可能需要对SOMETHING进行硬编码。


编辑:属性文件与应用程序相关。有关如何获取给定类的字节码的文件名的示例,请参阅http://www.exampledepot.com/egs/java.lang/ClassOrigin.html。你应该可以从那里继续。

Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/

您应该知道某些安全管理人员不允许这样做。

答案 2 :(得分:1)

我认为ClassName.class.getResourceAsStream()会对你有用。对该方法的评论指向ClassLoader.getResource(),它告诉您如何在类路径中指定文件。

这样的事情应该有效:

InputStream foo = ClassName.class.getResourceAsStream("file.name");

其中file.name位于类路径的底部。如果file.name在com.foo.bar包中,则使用“/com/foo/bar/file.name”

答案 3 :(得分:1)

如果我理解了correclty这个问题,另一种选择可能是在你的app中的jsp或静态文件上调用ServletContext.getRealPath(),并从结果中获取路径。

它意味着将webapp部署为“扩展” - 即不是压缩的战争文件 - 但这仍然是大多数应用程序所做的事情。

答案 4 :(得分:0)

您可以将属性文件放在类路径中,并使用以下内容将其作为输入流读取:

ClassName.class.getResourceAsStream(filePath + fileName);

其中filePath是类路径根目录中文件的相对路径,fileName是文件名。

如果您需要获取作为资源读取的文件的绝对路径,您可以执行以下操作:

ClassName.class.getResource(filePath + fileName).getPath()

答案 5 :(得分:0)

是否可以将配置文件放在类路径中并通过spring ClassPathResource等引用它?

您应该能够像这样使用它:

ClassPathResource foo = new ClassPathResource("file.name");

其中file.name存在于类路径中最低级别的某个位置,例如:

  • / web应用/ WEB-INF /类/
  • 您的一个jar文件的基础

答案 6 :(得分:0)

另一种方法可能是使用-D参数将变量值传递给JVM。这样,您可以将代码绑定到相同的变量名称,然后在启动时传递不同的值。我没有试过这个,但我认为它应该适用于部署在Tomcat中的应用程序,如果你修改startCatalina脚本以将-D参数传递给JVM

答案 7 :(得分:0)

您可以将属性文件的位置存储在JNDI中吗?

这应该可以跨Tomcat和Java EE Application Server移植。

答案 8 :(得分:0)

我们有相同的要求。到目前为止最简单的方法是将一个basedir属性存储在我们已经加载的属性文件中。然后定义一个像getExternalDocPath(String path)这样的方法。

这允许我们扩展Tomcat的文档库(只有Tomcat 7支持?)。在网上有人发布了一个实际扩展Tomcat文档库的类,允许多个路径,即“alpha; baker; charlie”。