本人遇到的情况:在一个工程中需要引用另外一个jar包,而引用的jar里有Json配置文件,这里出现了Json文件找不到的错误。这实际上也是java从jar包中读取配置文件的问题。
问题描述
取stackoverflow上的一个例子来说明。
我们的Json文件为:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | {"pagination": {
 "time": 1,
 "url": 2,
 "host": 3,
 "serverip": 4,
 "clientip": 5
 },
 "separator": "\t"
 }
 
 | 
下面是与Json文件对应的类:
| 12
 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文件,加入以下内容:
| 12
 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文件位置并读取的代码实现:
| 12
 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包中读取资源文件一文。