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

发布于 2024-07-13 23:23:17 字数 438 浏览 8 评论 0原文

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

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

给定:

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

We have been using System.getProperties("user.dir") to get the location of a properties file. Now that it has been deployed on Tomcat(via servlet), the System call is giving the location as tomcat and not at the location at where the properties file exist.

How can we call the the properties file dynamically?

Given:

  • Tomcat is not the only way the app
    will be deployed
  • We have no control on where the app
    may be placed.
  • Relative paths will not work as that
    Vista is being used and Vista breaks
    relative paths.
  • This must work on all OS,
    including(but not limited to) Linux,
    XP and Vista.
  • EDIT I implied this, but in case I was not clear enough, I have no way
    of knowing the path String.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

养猫人 2024-07-20 23:23:17

您必须有一种方法来了解属性文件的路径,然后可以将其包装在 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/

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

You must have a way of knowing the path of the property file which you can then wrap in a File and pass to the load() method of your properties object.

If you run inside a Tomcat service you are not running as the user you installed it as,so you cannot derive the home directory. You most likely need to hardcode SOMETHING then.


Edit: The property file is relative to the application. See http://www.exampledepot.com/egs/java.lang/ClassOrigin.html for an example of how to get to the file name for the bytecode for a given class. You should be able to continue from there.

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

You should be aware that some security managers disallow this.

夏末染殇 2024-07-20 23:23:17

看一下 ServletContextgetResourcegetResourceAsStream 方法。

Take a look at ServletContext's getResource and getResourceAsStream methods.

停顿的约定 2024-07-20 23:23:17

我认为 ClassName.class.getResourceAsStream() 将为您工作。 该方法的注释指向 ClassLoader.getResource(),它告诉您如何在类路径中指定文件。

像这样的东西应该可以工作:

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

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

I think ClassName.class.getResourceAsStream() will work for you. The comments on that method point you at ClassLoader.getResource(), which tells you how to specify a file in your classpath.

Something like this should work:

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

Where file.name is at the base of your classpath somewhere. If file.name is in the com.foo.bar package, you would use "/com/foo/bar/file.name"

负佳期 2024-07-20 23:23:17

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

这意味着 webapp 部署为“扩展”——即不是压缩的 war 文件——但这就是大多数应用程序服务器所做的。

If I understood the question correclty, another alternative might be to call ServletContext.getRealPath() on a jsp or a static file in your app and derive the path from the result.

It implies webapp deployed as "expanded" - i.e. not as a compressed war file - but that is what most appservers do anyway.

征棹 2024-07-20 23:23:17

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

ClassName.class.getResourceAsStream(filePath + fileName);

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

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

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

You can place your property files in your class path and read them as an input stream using something like:

ClassName.class.getResourceAsStream(filePath + fileName);

Where filePath is the relative path of the file from the class path root and fileName is the name of the file.

If you need to get the absolute path to a file you read as a resource, you can do some thing like this:

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

じее 2024-07-20 23:23:17

是否可以将配置文件放在类路径中并通过 springs ClassPathResource

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

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

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

  • /webapps/WEB-INF/classes/
  • jar 文件之一的基础

Is it possible to put the config file within the classpath and reference it via something like springs ClassPathResource?

You should be able to use it like this:

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

Where file.name exists somewhere in the classpath at the lowest level such as:

  • /webapps/WEB-INF/classes/
  • the base of one of your jar files
趴在窗边数星星i 2024-07-20 23:23:17

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

Another approach may be to pass the variable value to the JVM with -D parameter. That way you can tie your code to the same variable name and then pass different values at the time of start-up. I haven't tried this, but i'm thinking it should work for an app deployed in Tomcat as well, if you modify startCatalina script to pass -D parameter to JVM

聚集的泪 2024-07-20 23:23:17

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

这应该可以跨 Tomcat 和 Java EE 应用服务器移植。

You could store the location of your properties file in JNDI?

This should be portable across Tomcat, and for Java EE Application Servers.

束缚m 2024-07-20 23:23:17

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

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

We had the same requirements. The simplest thing that worked so far was to just store a basedir property in one of the property files we were already loading. Then define a method like getExternalDocPath(String path).

This allowed us to extend the docbase of Tomcat (which only Tomcat 7 supports?). Out on the web someone posted a class that actually extends Tomcat's docbase to allow multiple paths, i.e., "alpha;baker;charlie".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文