应用程序无法在Tomcat服务器上找到属性文件

马丁·尼尔森(Martin Nielsen)

我正在尝试让Tomcat加载一个外部属性文件,该文件位于WAR文件的类路径之外。

我有一个名为PropertiesSingleton的简单类,假定该类将属性文件加载到java.util.Properties对象中。

package my.test.properties;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class PropertiesSingleton {
    private static String filenameProperty = "testprops";
    private static IProperties properties;      //This is an interface that defines a number of get methods for each property
    private final static Logger log = LoggerFactory
        .getLogger(PropertiesSingleton.class);

    public static void main(String[] args) {
    IProperties props = PropertiesSingleton.load();
    }

    public static synchronized IProperties load() {
    InputStream stream;
    if (properties == null) {
        try {
        String propertyFileName = System.getProperty(filenameProperty);
        String variableFileName = System.getenv(filenameProperty);
        log.debug("Value of "+filenameProperty+" parameter: "+propertyFileName);
        log.debug("Value of "+filenameProperty+" env variable: "+variableFileName);
        PropertiesImpl props = new PropertiesImpl(); //A subclass of java.util.Properties implementing the IProperties interface
        if(propertyFileName != null && !propertyFileName.isEmpty()){
            File file = new File(propertyFileName);
            log.debug("Loading properties from parameter '"+propertyFileName+"'" + (file.exists() ? "" : ", which does not exist") );
            stream = new FileInputStream(file);
        }else if(variableFileName != null && !variableFileName.isEmpty()){
            File file = new File(variableFileName);
            log.debug("Loading properties from environment variable'"+variableFileName+"'"+ (file.exists() ? "" : ", which does not exist"));
            stream = new FileInputStream(file);
        }else{
            log.debug("Loading properties from properties file");
            stream = ClassLoader.getSystemClassLoader().getResourceAsStream("my/test/properties/test.properties");
        }
        if(stream == null){
            log.warn("Could not load the properties file");
            return props;
        }

        props.load(stream);
        properties = props;
        log.info("Loaded properties " + properties);
        } catch (IOException ex) {
        log.error("Could not load properties", ex);
        } catch (Exception ex) {
        log.error("Unexpected Error: Could not load properties", ex);
        throw ex;
        }
    }
    return properties;
    }

    public static synchronized IProperties reload(){
    properties = null;
    return load();
    }

}

当我添加Env属性并通过IDE运行main方法时,这似乎按预期工作。

2015-05-26 09:17:02,136 DEBUG Value of testprops parameter: null
2015-05-26 09:17:02,139 DEBUG Value of testprops env variable: C:\test\test.properties
2015-05-26 09:17:02,141 DEBUG Loading properties from environment variable'C:\test\test.properties'
2015-05-26 09:17:02,141 INFO Loaded properties {defaultLocale=dk, host=123.123.123.123}

但是,当我不愿将这些代码打包并在本地Tomcat8上运行时,我会收到一条令人振奋的新消息。(tomcat WAR有时会调用PropertiesSingleton.load):

2015-05-26 09:17:02,136 DEBUG Value of testprops parameter: null
2015-05-26 09:17:02,139 DEBUG Value of testprops env variable: C:\test\test.properties
2015-05-26 09:17:02,141 DEBUG Loading properties from environment variable'C:\test\test.properties', which does not exist
2015-05-26 09:42:36,114 ERROR Could not load properties
java.io.FileNotFoundException: C:\test\test.properties (The system cannot find the file specified)

Tomcat中是否有一些安全功能现在允许我访问文件系统,还是其他严重错误?

我还应注意,我正在执行此练习,因为我需要一个外部属性文件,该文件位于Tomcat服务器上WAR上下文之外。有几个原因。例如,几个应用程序将共享另一个正在运行的应用程序的配置。WAR中的属性文件将是不切实际的。如果有人知道从WAR读取外部属性文件的另一种方法,那么该方法也将很乐意被接受为答案。

意识

servlet规范不支持访问基础文件系统,并且不能保证其正常工作,特别是如果访问是通过未爆炸的.war-file文件进行的(我假设这就是您的情况)。

它使您的应用依赖于基础系统-操作系统,服务器等。建议的方法是将配置打包在.war-file中。

如果您必须这样做(并且我同意使用外部配置可能是个好主意),那么这是一种更独立于操作系统的方式,应该使用java.net.URL,并使用以下文件:URI方案

URL url = new URL("file:///test/test.properties");

URLConnection con = url.openConnection();
ResourceUtils.useCachesIfNecessary(con);

InputStream stream = con.getInputStream();

改编自org.springframework.core.io.UrlResource.getInputStream()如果可以,请使用像Spring及其Resource抽象之类的库/框架

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

应用程序将无法在Eclipse中的Tomcat服务器上运行

来自分类Dev

无法在Linux服务器上运行Grails应用程序-Tomcat和H2数据库

来自分类Dev

部署简单的Web应用程序时,java文件(即servlet)不在服务器(Tomcat)上运行

来自分类Dev

将Flask应用程序服务器与应用程序所需的其他文件一起放置在文件夹中时,获取“未在服务器上找到请求的URL”的消息

来自分类Dev

无法使用Tomcat或GlassFish服务器从Java Jersey应用程序获取JSON响应

来自分类Dev

运行Java应用程序以在tomcat服务器上运行

来自分类Dev

应用程序未在Tomcat 7服务器上加载

来自分类Dev

同一Tomcat服务器上的两个应用程序之间的双向SSL

来自分类Dev

运行Java应用程序以在tomcat服务器上运行

来自分类Dev

如何在Tomcat服务器上运行Spark应用程序

来自分类Dev

从Java应用程序监视Tomcat服务器

来自分类Dev

无法联系服务器,应用程序无法打开

来自分类Dev

保护Web服务器上的文件并通过iPhone应用程序访问文件

来自分类Dev

为什么Node.js简单的HTTP服务器应用程序无法在服务器上运行?

来自分类Dev

如何制作服务器块配置文件以在 Nginx 服务器上运行 CakePHP 应用程序?

来自分类Dev

如何将Django应用程序部署到无法使用pip的服务器上

来自分类Dev

Flask应用程序无法在Heroku服务器上启动

来自分类Dev

服务器上的Web应用程序无法读取样式表

来自分类Dev

Jruby + swt。无法在Amazon服务器上执行应用程序

来自分类Dev

ASP.NET MVC 2.0应用程序无法在服务器上运行

来自分类Dev

如何将Django应用程序部署到无法使用pip的服务器上

来自分类Dev

我无法在Worklight开发服务器上运行我的移动应用程序

来自分类Dev

Web应用程序无法从服务器上的MySQL查询

来自分类Dev

无法在远程服务器上运行 Vaadin 应用程序

来自分类Dev

无法将日志从我在 heroku 上的 nodejs 应用程序保存到服务器

来自分类Dev

闪亮的服务器:应用程序无法在 AWS 上启动

来自分类Dev

Erlang / Yaws:无法使用.conf文件在应用程序中启动Web服务器

来自分类Dev

如何解决无法在模板文件夹中找到HTML文档的Flask应用程序导致内部服务器错误

来自分类Dev

执行时,在开发服务器上发布的应用程序仍引用Visual Studio中的文件

Related 相关文章

  1. 1

    应用程序将无法在Eclipse中的Tomcat服务器上运行

  2. 2

    无法在Linux服务器上运行Grails应用程序-Tomcat和H2数据库

  3. 3

    部署简单的Web应用程序时,java文件(即servlet)不在服务器(Tomcat)上运行

  4. 4

    将Flask应用程序服务器与应用程序所需的其他文件一起放置在文件夹中时,获取“未在服务器上找到请求的URL”的消息

  5. 5

    无法使用Tomcat或GlassFish服务器从Java Jersey应用程序获取JSON响应

  6. 6

    运行Java应用程序以在tomcat服务器上运行

  7. 7

    应用程序未在Tomcat 7服务器上加载

  8. 8

    同一Tomcat服务器上的两个应用程序之间的双向SSL

  9. 9

    运行Java应用程序以在tomcat服务器上运行

  10. 10

    如何在Tomcat服务器上运行Spark应用程序

  11. 11

    从Java应用程序监视Tomcat服务器

  12. 12

    无法联系服务器,应用程序无法打开

  13. 13

    保护Web服务器上的文件并通过iPhone应用程序访问文件

  14. 14

    为什么Node.js简单的HTTP服务器应用程序无法在服务器上运行?

  15. 15

    如何制作服务器块配置文件以在 Nginx 服务器上运行 CakePHP 应用程序?

  16. 16

    如何将Django应用程序部署到无法使用pip的服务器上

  17. 17

    Flask应用程序无法在Heroku服务器上启动

  18. 18

    服务器上的Web应用程序无法读取样式表

  19. 19

    Jruby + swt。无法在Amazon服务器上执行应用程序

  20. 20

    ASP.NET MVC 2.0应用程序无法在服务器上运行

  21. 21

    如何将Django应用程序部署到无法使用pip的服务器上

  22. 22

    我无法在Worklight开发服务器上运行我的移动应用程序

  23. 23

    Web应用程序无法从服务器上的MySQL查询

  24. 24

    无法在远程服务器上运行 Vaadin 应用程序

  25. 25

    无法将日志从我在 heroku 上的 nodejs 应用程序保存到服务器

  26. 26

    闪亮的服务器:应用程序无法在 AWS 上启动

  27. 27

    Erlang / Yaws:无法使用.conf文件在应用程序中启动Web服务器

  28. 28

    如何解决无法在模板文件夹中找到HTML文档的Flask应用程序导致内部服务器错误

  29. 29

    执行时,在开发服务器上发布的应用程序仍引用Visual Studio中的文件

热门标签

归档