`
cfyme
  • 浏览: 273575 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

listener代码找不到properties文件的坑

 
阅读更多

这是一个隐形的坑。

 

   先贴出项目中一个listerner源代码,仔细观察:

 

public class SystemConfigInitListener implements ServletContextListener{

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        String prefix = sce.getServletContext().getRealPath("/");
        String file = sce.getServletContext().getInitParameter("systemConfigLocation");
        Properties props = new Properties();
        InputStream is = null;
        try {
            if (file.startsWith("classpath:")) {
                is = SystemConfigInitListener.class.getClassLoader().getResourceAsStream(file.substring(10));
            }
            else {
                String filePath = prefix + file;
                is = new FileInputStream(filePath);
            }
            props.load(is);
            for(Enumeration<Object> it = props.keys(); it.hasMoreElements();){
                String key = (String)it.nextElement();
                System.setProperty(key, props.getProperty(key));
                sce.getServletContext().setAttribute(key, props.getProperty(key));
            }
        }
        catch (Exception e) {
        }finally{
            if(is != null){
                try{
                    is.close();
                }catch(Exception e){}
            }
        }
        
        
        file = sce.getServletContext().getInitParameter("systemConfigLocationOverride");
        Properties props2 = new Properties();
        InputStream is2 = null;
        try {
            if (file.startsWith("file:")) {
                is2 = new FileInputStream(file.substring(5).replaceAll("\\$\\{user.home\\}", System.getProperty("user.home")));
            }
            else {
                String filePath = prefix + file;
                is2 = new FileInputStream(filePath);
            }

            props2.load(is2);
            for(Enumeration<Object> it = props2.keys(); it.hasMoreElements();){
                String key = (String)it.nextElement();
                System.setProperty(key, props2.getProperty(key));
                sce.getServletContext().setAttribute(key, props2.getProperty(key));
            }
        }
        catch (Exception e) {
        }finally{
            if(is != null){
                try{
                    is2.close();
                }catch(Exception e){}
            }
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
        
    }

}

 

 

    这段代码在线上,测试服务器上运行是没有问题的,在苹果电脑上运行也是没有问题的,在windows电脑上运行表面上看起来也是没有问题的,其实是又问题的,因为异常被吃掉了,没有打印出来,被你忽略掉了。

    

    web.xml中有这样一个配置:

 

<context-param>
		<param-name>systemConfigLocationOverride</param-name>
		<param-value>file:${user.home}/config/sigma-release.properties</param-value>
</context-param>

 

 

  该配置的作用就是listerner代码在服务启动初始化的时候,将config目录下的配置项替换为真正的配置。

 

  

   服务器上的config目录: /home/www/config 没有问题

 

   假如你的config目录是这个 C:\\Users\\用户名\\config  恭喜你,你踩到坑了

   

 

   因为listerner的下面这行代码会报错,但是错误信息又被吃掉,你没有及时发现,导致在本地测试的时候,没有达到你期望的效果。

 

  如果我们在异常中加上打印信息,例如e.printStackTrace();

  会报下面的错误信息的:



 

 

导致上面异常的真正原因是下面这行代码:

 

is2 = new FileInputStream(file.substring(5).replaceAll("\\$\\{user.home\\}", System.getProperty("user.home")));

 

 

   这行代码在linux平台,苹果电脑上运行是没有问题的。
   但是如果你是windows,而你的config目录又是C:\\Users\\用户名\\config,可以通过下面这行代码打印出来
  
String userhomePath = System.getProperty("user.home");
System.out.println("===userhomePath===" +userhomePath);
   
     我本地打印的是c:,我早就修改成了根目录,所以不会有任何问题。而不是c:/xxx/xxx/xxx很深的目录,(修改参考:http://cfyme.iteye.com/blog/2209012)
     解决方案1:将斜杠替换掉,replaceAll("\\\\", "/")));
例如:
                is2 = new FileInputStream(file.substring(5).replaceAll("\\$\\{user.home\\}", System.getProperty("user.home").replaceAll("\\\\", "/")));

 

   

    解决方案2:直接将user.home目录设置成根目录,设置方法参考:http://cfyme.iteye.com/blog/2209012

 

 

    总结:1,异常不要被吃掉,不然遇到一些问题难以发现。

               2,环境配置项的问题最后在系统启动初始化的时候全部加载打印到日志文件中,方便查看是否我们真正所期望的值。

 

 

 

 

  • 大小: 8.4 KB
  • 大小: 142.1 KB
分享到:
评论

相关推荐

    严重: Error listenerStart

    例如,IDE(集成开发环境)中的调试功能,可以用来跟踪代码执行流程,找出问题所在。 `log4j-1.2.16.jar`和`commons-logging-1.1.jar`是两个重要的日志相关库。`log4j.properties`则是Log4j的配置文件,它定义了...

    JPF的Eclipse环境安装运行过程

    site.properties 文件告诉 JPF 在初始化时在哪里寻找到安装的项目。用户需要亲自对其添加 classpath。建议使用默认位置:&lt;user.home&gt;/.jpf/site.properties。 安装 Eclipse JPF 插件 为了在 Eclipse 中使用 JPF,...

    BBS论坛源代码JAVA版

    中,虽然只给出了"09"这个文件名,但通常情况下,一个完整的JAVA项目源码会包含多个文件和文件夹,如Java类文件(.java)、编译后的字节码文件(.class)、配置文件(如.xml、.properties)、静态资源(HTML、CSS、...

    proxool listener

    1. **Proxool配置**:通常,开发者会在应用的配置文件(如`proxool.properties`)中设置Proxool的各项参数,如最大连接数、最小连接数、超时时间等,并定义监听器的相关属性。 2. **监听器类型**:Proxool支持多种...

    记事本标注程序代码(JAVA)

    10. **国际化(Internationalization,i18n)**:尽管这个例子中的记事本可能不涉及,但Java提供了资源包(Properties文件)支持多语言,对于专业软件来说,这是一个重要的考虑因素。 通过以上知识点的学习和实践,...

    jmeter一个测试的配置文件

    在IT领域,性能测试是任何应用程序不可或缺的一环,它确保软件系统在高负载下仍能保持稳定运行。Apache JMeter是一款开源、跨平台的性能测试工具,广泛用于对Web应用进行压力测试。本文将详细探讨一个名为“optest -...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    详解如何在Spring Boot启动后执行指定代码

    在上面的代码中,我们实现了 ApplicationListener 接口,并在 onApplicationEvent 方法中执行特定的代码。在这个例子中,我们使用了 SourceRepository 来保存一个 Source 对象。 然而,这个类并不会自动执行,我们...

    springmvcfileupload.rar

    本文将深入探讨如何在Spring MVC环境中实现文件上传,以及相关的配置与代码实现。 1. **Spring MVC 框架概述** Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用提供了模型-视图-控制器(MVC)架构。...

    JavaWebPro1.zip

    总之,JavaWebPro1.zip文件中的内容涉及到Java Web开发的多个层面,包括但不限于Servlet、JSP、JSTL、数据库连接、MVC架构、Spring框架、前端技术等。通过解压并分析这个项目,开发者可以学习到实际的Web应用开发...

    Struts2的监听器的使用

    此外,`Struts2_8`压缩包文件可能包含有关Struts2监听器使用的示例代码、配置文件或教程文档。通过研究这些资源,你可以更好地理解和应用Struts2监听器,从而提升你的Web应用程序的性能和功能。 总之,Struts2监听...

    安卓Android源码——多种控件多种实现方式Demo.zip

    `default.properties`文件是Android项目的属性配置文件,它通常包含了一些基本信息,比如最小API级别等。在Android Studio中,这些信息会被迁移到`build.gradle`文件中。 `AndroidManifest.xml`是每个Android应用的...

    SSI框架 部署手册

    - `messageResource.properties`: 默认配置文件,当找不到特定语言配置文件时使用。 - **配置文件示例**: ```properties # messageResource_zh_CN.properties loginPage=欢迎页面 ``` ```properties # ...

    在tomcat中部署mule项目

    然后,从Mule的主目录`lib`文件夹中复制所有子文件夹(不包括`boot`文件夹)到`mule-libs`。 3. 把`mule-module-tomcat-&lt;version&gt;.jar`文件从`mule-libs/mule`目录复制到Tomcat的根目录。这个文件是Mule与Tomcat...

    java 电子相册源码

    7. **配置参数**:播放速度的设置可能涉及到配置文件的读写,如XML或properties文件。Java提供`Properties`类来处理这类配置。 8. **设计模式**:良好的代码结构往往采用设计模式,如单例模式用于管理共享资源(如...

    文本编辑器(JAVA版)

    文本编辑器在IT行业中是开发人员日常工作中不可或缺的工具,用于编写、查看和修改各种文本文件,包括编程源代码。本项目是一个基于JAVA语言实现的文本编辑器,它提供了丰富的功能,如源代码查看和皮肤切换,使得用户...

    自己收集的JAVA工具类

    在这个名为"自己收集的JAVA工具类"的压缩包中,包含了多个实用功能,如配置文件读取、验证码生成、分页器实现、JSP导出Excel、MD5加密、JDBC工具以及数据源和listener相关的类。接下来,我们将详细探讨这些知识点。 ...

    spring boot整合spring-kafka实现发送接收消息实例代码

    然后,我们需要在 application.properties 文件中配置 Kafka 服务器的地址: ```properties spring: kafka: bootstrap-servers: &lt;kafka-server&gt;:9092 ``` 发送消息 在 Spring Boot 中,我们可以使用 `...

    ssh框架的配置

    另外,`ContextLoaderListener`监听器用于初始化WebApplicationContext,它会在Web应用启动时读取配置文件并创建Spring的IoC容器。 ```xml &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context....

Global site tag (gtag.js) - Google Analytics