本人遇到的情况:在一个工程中需要引用另外一个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对象中,遇到两个问题:

  1. Json文件是存在config目录下,打jar包时如何将Json文件连同config目录一同打入jar包;
  2. 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包中读取资源文件一文。