3

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

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

鉴于:

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

9 回答 9

2

看看ServletContext's getResourcegetResourceAsStream方法。

于 2009-02-17T20:13:00.240 回答
2

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

如果您在 Tomcat 服务中运行,则您没有以安装它的用户身份运行,因此您无法派生主目录。你很可能需要硬编码一些东西。


编辑:属性文件是相对于应用程序的。有关如何获取给定类的字节码文件名的示例,请参见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/

您应该知道,一些安全管理器不允许这样做。

于 2009-02-17T22:42:03.910 回答
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”

于 2009-02-17T21:48:15.457 回答
1

如果我正确理解了这个问题,另一种选择可能是ServletContext.getRealPath()在您的应用程序中调用 jsp 或静态文件并从结果中派生路径。

这意味着 webapp 部署为“扩展” - 即不是作为压缩的 war 文件 - 但这就是大多数 appservers 所做的。

于 2009-03-25T08:40:50.370 回答
0

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

ClassName.class.getResourceAsStream(filePath + fileName);

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

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

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

于 2009-02-17T20:27:32.593 回答
0

是否可以将配置文件放在类路径中并通过 springs ClassPathResource之类的东西引用它?

您应该可以像这样使用它:

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

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

  • /webapps/WEB-INF/classes/
  • 您的 jar 文件之一的基础
于 2009-02-17T21:19:03.093 回答
0

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

于 2009-02-17T22:05:24.870 回答
0

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

这应该可以跨 Tomcat 移植,并且适用于 Java EE 应用程序服务器。

于 2009-02-18T14:10:14.817 回答
0

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

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

于 2011-03-19T13:55:34.557 回答