获得jar包存放路径的方法

摘要:
比如说,有一个pathTest.jar包放在D:\zeal\webdev下,这个jar执行的时候需要在当前目录下读写一个test.log文件。解决的方法是必须在程序中指定test.log文件的绝对路径。从本意上来讲,这里我们希望test.log与pathTest.jar位于相同的路径之下。幸好,java允许我们定位某个class的CodeSource,通过CodeSource提供的Location信息就能够找到相关的文件路径。假设pathTest.jar的mainclass是pathTest,通过newpathTest().getClass().getProtectionDomain().getCodeSource().getLocation();就可以得到pathTest.jar的完整路径,接下来怎么做就简单了。

在 java 中, System.getProperty("user.dir") 得到的是当前工作路径(对应命令行命令就是 linux 下的 pwd 、 windows 下的 cd ),而 System.getProperty("user.home") 得到的是当前用户主目录(对应于 linux 下的 ~ 目录、 windows 下的 document and settings\username );但如果你想得到所运行的 java 程序所在的路径,似乎并没有什么简单的方法。

比如说,有一个 pathTest.jar 包放在 D:\zeal\webdev 下,这个 jar 执行的时候需要在当前目录下读写一个 test.log 文件。如果不采用绝对路径来读写 test.log 的话,不同的 jar 运行方式会带来不同的结果:

cd D:\zeal\webdev
java -jar pathTest.jar

( test.log 将生成在 D:\zeal\webdev 目录下 )

cd E:\sun\jre\bin
java -jar D:\zeal\webdev\pathTest.jar

( test.lgo 将生成在 E:\sun\jre\bin 目录下 )

这势必造成潜在的运行错误。解决的方法是必须在程序中指定 test.log 文件的绝对路径。从本意上来讲,这里我们希望 test.log 与 pathTest.jar 位于相同的路径之下。但显然无论是 "user.dir" 还是 "user.home" 都不会返回正确的结果。

幸好, java 允许我们定位某个 class 的 CodeSource , 通过 CodeSource 提供的 Location 信息就能够找到相关的文件路径。假设 pathTest.jar 的 main class 是 pathTest ,通过

new pathTest().getClass().getProtectionDomain().getCodeSource().getLocation();

就可以得到 pathTest.jar 的完整路径( file:/D:/zeal/webdev/pathTest.jar ),接下来怎么做就简单了。当然,实际应用中一般我们会选择把所有与jar相关的资源文件一起打包进去,或者使用 "user.home" 这样的固定位置来存放;除非在特殊情况下才会需要通过这个迂回的方式来获取相关的路径信息

private static String getPath(String name) {
//得到当前类加载器的路径
String currentPath = ExcelFilePath.class.getResource("/").toString();
currentPath = currentPath.substring(6); //去掉路径中的"file:/"
currentPath = URLDecoder.decode(currentPath);
//去掉WEB-INF/classes/
currentPath = currentPath.substring(0, currentPath.lastIndexOf("WEB-INF"));
//得到当前是什么操作系统
String os = System.getProperty("os.name");
String filePath = "";
if(os.startsWith("Windows"))
filePath = currentPath+PropertyManager.getProperty(name);
else
filePath = "/"+currentPath+PropertyManager.getProperty(name);

logger.info(filePath);
return filePath;
}

package cn.yicha.adclient.util;
import java.util.Properties;
import org.apache.log4j.Logger;

/**
* 获取邮件配置文件内容管理
* @author yicha
*
*/
public class PropertyManager {
private static Properties p = new Properties();
private static Logger logger = Logger.getLogger(PropertyManager.class);
public static String getProperty(String propName){
String propValue = null;
if(p.isEmpty()){
synchronized{
try {
p.load(PropertyManager.class.getResourceAsStream("/mail.properties"));
}catch (Exception e) {
logger.error("load mail properties file exception: "+e);
}
}
}
if(p!= null){
propValue = (String)p.get(propName);
if(propValue==null)propValue="";
}
return propValue;
}

public static void main(String [] pa){
System.out.println(PropertyManager.getProperty("ChargeMailContentFile"));
}

免责声明:文章转载自《获得jar包存放路径的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇bwa比对软件的使用以及其结果文件(sam)格式说明Wireshark中TCP segment of a reassembled PDU的含义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ElasticSearch(八):springboot集成ElasticSearch集群并使用

1. 集群的搭建 见:ElasticSearch(七) 2. springboot配置集群 2.1 创建springboot项目,使用idea创建,不过多介绍(创建项目时候建议不要勾选elasticsearch,springboot目前自带的elasticsearch版本为5.6.10,如果你版本高于这个版本,还是自己手动导入。) 2.2 导入依赖...

[C#]通过调用Word模板(Doc、dot)直接打印

通过替换模板中的指定 书签 来进行内容的替换、整合,然后直接发送到打印打印,也可以导出。即把打印出的语句换成保存函数。 public static classmyPrintByOffice { public static voidbyDoc(Stringtime,Stringuid) { Microsoft.Office.Interop.Word.Appl...

【工具类用法】Hutool里的生成唯一Id唯的工具类

目录 一、介绍 二、使用 2.1 UUID 2.2 ObjectId 2.3 Snowflake 三、测试类 3.1 测试类 3.2 测试结果 一、介绍在分布式环境中,唯一ID生成应用十分广泛,生成方法也多种多样,Hutool针对一些常用生成策略做了简单封装。 唯一ID生成器的工具类,涵盖了: UUIDObjectId(MongoDB)Snowflake(...

死磕 java集合之WeakHashMap源码分析

欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。 简介 WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时候,如果这些key没有强引用存在的话,会被gc回收掉,下一次当我们操作map的时候会把对应的Entry整个删除掉,基于这种特性,WeakHashMap特别适用于缓存处理。 继承体...

Java 之 clone 方法(对象拷贝)

一、对象的克隆(拷贝)   克隆的对象包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。 二、克隆分类   1、克隆对象前提 protected native Object clone() throws CloneNotSupportedException;     ...

用postman模拟ajax发送json数据的笔记

header是这个: 但是你后台,你知道吗,用request.getParameter("sysName");是接受不到的, 因为json串在requset的body中。如果不用@RequsetBody注解,那就要写方法从流中读取参数。 public static String getRequestBody(HttpServletRequest req)...