上一篇已经大致的将了本地状况下DaTaX的纯Java代码启动的过程

http://www.cnblogs.com/blogsofmy/p/8287637.html不了解的请点超链接

这次我们来说说文件被打成jar包之后的路径问题

上一篇中因为全是本地文件,所以就算是用绝对路径也不会出问题,但是当文件被打成jar包之后,问题就暴露出来了,这个jar包会处于什么位置完全不确定,

那么 我们应该怎么来获取该项目的运行路径呢,怎么来正确的加载资源呢。

先看看如何来加载某一处的资源

public static String DATAX_CONF_PATH = System.getProperty("core","classpath:conf/core.json");
我们的静态环境变量可以先通过
System.getProperty()来加载jvm已经定义好了的变量
我们来可看看源码
public static String getProperty(String key, String def) {
checkKey(key);
SecurityManager sm = getSecurityManager();
if (sm != null) {
sm.checkPropertyAccess(key);
}

return props.getProperty(key, def);
}
首先判断key的值是null还是空,如果都不是则正常运行
然后用安全加载起加载jvm中已经第一好的值,然后sm不为空,则根据key找到value
如果是空,直接返回默认值def 我们的是
classpath:conf/core.json
ok   继续执行
private static Configuration parseCoreConfig(final String path) {
//相对路径 classpath:/conf/core.json
if (path.startsWith("classpath:")) {
// /conf/core.json
String realPath = StringUtils.substringAfter(path, "classpath:");
Configuration from = Configuration
.from(ClassLoader.getSystemResourceAsStream(realPath));
System.out.println(ClassLoader.getSystemResource(realPath));

return from;
} else {
//绝对路径
return Configuration.from(new File(path));
}
}
完整代码如上 我们来解析一下
如果路径以classpath:开头 那么说明是我们刚才第一好了的默认值
利用
StringUtils.substringAfter(path, "classpath:");
来进行切分路径

现在我们只剩下了一个相对路径 ,重点来了
ClassLoader.getSystemResource(realPath)
就是这一句代码 diao炸天有没有,可以根据相对路径来获取到绝对路径 。 这个是某个写底层的程序猿已经帮我们把过程写好了。
这个涉及的有点多了,就先不分析了。
日后再说。

如果执行
System.out.println(ClassLoader.getSystemResource(realPath));
上面这一句可以发现 。我们的路径还是多了点东西
这段代码执行完成之后是这样的
file:绝对路径
多了个file:呀
不过没关系,我们可以来进行切割
public static String DATAX_HOME =StringUtils.substringBefore(
ClassLoader.getSystemResource(
StringUtils.substringAfter(DATAX_CONF_PATH, "classpath:")).getPath(),
"/core/t");
我们里面涉及到前切,后切和类型转换,看不懂就百度关键字吧

ok 我们得到了什么 !!!!
动态的  DATAX_HOME

没错,现在文件无论怎么打包都没问题了,我们都可以直接调用。先说到这吧。






版权声明:本文为blogsofmy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/blogsofmy/p/8308645.html