本人遇到的情况:在一个工程中需要引用另外一个jar包,而引用的jar里有Json配置文件,这里出现了Json文件找不到的错误。这实际上也是java从jar包中读取配置文件的问题。
问题描述
取stackoverflow上的一个例子来说明。
我们的Json文件为:
1 2 3 4 5 6 7 8 9 10
| { "pagination": { "time": 1, "url": 2, "host": 3, "serverip": 4, "clientip": 5 }, "separator": "\t" }
|
下面是与Json文件对应的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class jsonLog { private String separator; private Map<String, Integer> map;
public String getSeparator() { return separator; } public void setSeparator(String separator) { this.separator = separator; } public Map<String, Integer> getMap() { return map; } public void setMap(Map<String, Integer> map) { this.map = map; }
}
|
目的是将Json文件的内容读取到jsonLog对象中,遇到两个问题:
- Json文件是存在config目录下,打jar包时如何将Json文件连同config目录一同打入jar包;
- Json文件打进jar包,其他工程再引用该jar包时,此时Json所在目录已经变化,如何动态获取Json文件所在位置。
打jar包
这里需要修改Maven工程的pom文件,加入以下内容:
1 2 3 4 5 6 7 8 9 10 11
| <build> <resources> <resource> <directory>config</directory> <includes> <include>**/*.json</include> </includes> <targetPath>config</targetPath> </resource> </resources> </build>
|
这几行的意思就是打包时把目录config
(directory)下的json文件也打进去,并且放在config
(targetPath)目录下。
读取Json文件
动态获得json文件位置并读取的代码实现:
1 2 3
| objectMapper = new ObjectMapper(); InputStream inputstream = this.getClass().getResourceAsStream("/config/xx.json"); LogConfig config = objectMapper.readValue(inputstream, LogConfig.class);
|
通过Class
类的getResourceAsStream()
方法来获取Json文件,这种方法是专门读取jar中的资源文件的。可参考java从jar包中读取资源文件一文。