我们一直在使用System.getProperties(“user.dir”)来获取属性文件的位置。现在它已经部署在Tomcat上(通过servlet),系统调用将位置设置为tomcat而不是属性文件所在的位置。
我们如何动态调用属性文件?
假设:
答案 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存在于类路径中最低级别的某个位置,例如:
答案 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”。