一般情况下Java程序都是打成Jar包发布的,运行时从Jar包启动。但是,在开发与调试阶段,打成Jar包不方便,一般直接运行class文件。两种不同的启动环境,资源的URL不同,可以通过资源URL来区别。
可以通过下面方式判断启动环境
private boolean isRunInJar() {
String resourcePath = "/"+PathNet.class.getPackageName().replace(".", "/");
URL url = PathNet.class.getResource(resourcePath);
System.out.printf("RunEnvironment url: %s\n", url);
if (StringUtils.equals(url.getProtocol(), "jar")) {
return true;
} else {
return false;
}
}
其中resourcePath需要取Jar中实际存在的路径,否则返回空,而且必须唯一,不能与调用此Jar的Project一致,否则会返回调用者的url。所以取package名比较合适,需要注意的是将package名中的“.“换成“/”。
当从class启动时,log如下:
RunEnvironment, protocol:file, url: file:/D:/projectfolder/classes/packageName
当从jar启动时,log如下:
RunEnvironment, protocol:jar, url: jar:file:/D:/projectfolderk/jarname.jar!/packageName
下面例子取的resourcePath更好
https://blog.youkuaiyun.com/weixin_34137799/article/details/93495666