spring booot 外部文件加载

  1. 场景

    有一个项目需要加载一个自定义的xml文件。正常情况下,我们把资源文件放到src/main/resources目录下。这样就有一个问题,这里面的资源文件会被一起打包到jar里面。  

    如果只是spring本身的文件还好说,因为spring boot会加载jar同级目录以及与jar同级的conf目录下的application*.properties文件。而我们的xml文件,不是spring加载的,是我们自己写的解析。  

    这样发布后,只能从classpath加载,也就是jar包本身里面。现在要求实现类spring这种方式来加载。

    先通过下图看看原来的加载方式,直接中classpath中加载,代码量极少。

    spring booot 外部文件加载_第1张图片
    spring booot 外部文件加载_第2张图片
  2.  

    方案

    首先我们可以获取到jar本身路径,然后直接从jar路径找xml文件,找不到的时候在找同级的conf目录,还是没有的话,再使用classpath下的xml文件。 这样就可以把配置文件放到jar的外面了。以后有修改,就不需要在重新打包了。

    加载资源文件的代码如下:

    File file = new File("client-system.xml") // 这里表示从jar同级目录加载

     

    if (!file.exists()) { // 如果同级目录没有,则去config下面找

        file = new File("config/client-system.xml");

    }

    Resource resource = new FileSystemResource(file);

    if (!resource.exists()) { //config目录下还是找不到,那就直接用classpath下的

        resource = resourceLoader.getResource("classpath:client-system.xml");

    }

    SAXReader reader = new SAXReader();

    Document doc = reader.read(resource.getInputStream());

    //.....到此资源文件就可以从三个预选路径中加载了

    //.....省略后面的对xml操作等代码

     

     

    最后配置文件可以如下图方式存放,client-system.xml就是我们的自定义配置文件,

    spring booot 外部文件加载_第3张图片
    spring booot 外部文件加载_第4张图片
  3.  

    编写测试

    在加载xml文件的地方加入了打印输出,为了方便直观没有用Logger了,直接使用System.out.println了。代码如下:

    spring booot 外部文件加载_第5张图片
  4.  

    运行jar包

    通过java -jar 来运行打好的jar文件。再看日志输出,与左边的文件进行对比。

    第一种方式将xml和资源文件放到jar同级目录;

    第二方式将xml放到jar同级的config目录;

    第三种方式就是默认方式,从jar内部加载。

    每种方式的输出结果请留意控制台中的高亮部分。

    spring booot 外部文件加载_第6张图片
    spring booot 外部文件加载_第7张图片
    spring booot 外部文件加载_第8张图片
    spring booot 外部文件加载_第9张图片
    spring booot 外部文件加载_第10张图片
    END
 
 

你可能感兴趣的:(spring booot 外部文件加载)