今天找了半天的毛病 关于java的一个写入记事本的小程序 封装成jar包后 因为我的机器上有运行环境 所以双击 就能在jar包的所在位置执行 并且生成了一个记事本 但是在控制台里用java -jar 执行的时候 就没有生成记事本 其实最后发现也不是没有生成 是生成在了 控制台的当前目录下 比如在d盘执行 就生成在d盘了 而我的jar包 在桌面呢 一开始以为是打的命令有错误 然后发现就是控制台路径的问题 只要把控制台的路径放大jar包的位置 就可以在那生成 记事本文件 然后 我开始改代码 什么相对路径 绝对路径的 大改了一通 发现网上好多说的都不对 因为在封装成jar包之后 就和在开发环境里执行的效果是不一致的 甚至是执行不了 好了 牢骚 就发到这吧 以上是我的经历 下面开始转载 这篇文章转自:http://www.cherrot.com/2012/02/howto-get-directory-of-jar-archive
之前转过一篇文章,详细介绍了如何读取保存在jar包内的资源文件。今天又遇到个问题,如何定位jar包所在位置呢?比如要输出错误日志到jar包的同级目录时,我们就需要知道jar包存放的目录。众所周知,未打包的.class文件获取当前目录很容易,但是打包成.jar文件就迥然不同了
搜来搜去,找到两个办法:
方法一:使用类路径
String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath()
这种方法可以得到当前程序jar文件的绝对路径(字符串值)。如果以被打成jar包,调用getFile()或调用getPath()得到的结果是相同的,均为 the/path/to/abc.jar 的形式。然而如果是class文件的话,两个方法调用返回的是不同的结果,这里不多做解释。
使用该方法得到的字符串是定位到jar文件的,如果想只得到jar文件所在目录,那么需要对该字符串再做处理,或者在getLocation()方法返回的URL上作处理。另外注意,如果路径包含Unicode字符(汉字),那么还需要使用 java.net.URLDecoder.decode(path, “UTF-8″) 方法进行转码,其中path是需要转码的字符串路径。
方法二:使用JVM属性
String path = System.getProperty("java.class.path")
这里使用了java运行时的系统属性来得到jar文件的位置,结果同1方法大致相同,且不需要做转码处理。 更多系统属性参见Oracle的说明。在使用class测试时,该方法得到的路径为 “类库路径:当前class路径”(Windows系统应该显示”类库路径;当前class路径”),然而运行jar包时只会得到我期望的jar包路径,这一点有点不解。
从jar包路径的到jar包的目录,我的方法是:
int firstIndex = path.lastIndexOf(System.getProperty("path.separator"))+1
int lastIndex = path.lastIndexOf(File.separator) +1;
path = path.substring(firstIndex, lastIndex);
当然,如果是采用方法一,就不需要计算firstIndex了。
另外为了扫盲,注明下面这写忽悠人的错误做法
print(Thread.currentThread().getContextClassLoader().getResource(“”));
print(CurrentDirectory.class.getClassLoader().getResource(“”));
print(ClassLoader.getSystemResource(“”));
print(CurrentDirectory.class.getResource(“”));
print(CurrentDirectory.class.getResource(“/”));
print(new File(“”).getAbsolutePath());
print(System.getProperty(“user.dir”));
之前转过一篇文章,详细介绍了如何读取保存在jar包内的资源文件。今天又遇到个问题,如何定位jar包所在位置呢?比如要输出错误日志到jar包的同级目录时,我们就需要知道jar包存放的目录。众所周知,未打包的.class文件获取当前目录很容易,但是打包成.jar文件就迥然不同了
搜来搜去,找到两个办法:
方法一:使用类路径
String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath()
这种方法可以得到当前程序jar文件的绝对路径(字符串值)。如果以被打成jar包,调用getFile()或调用getPath()得到的结果是相同的,均为 the/path/to/abc.jar 的形式。然而如果是class文件的话,两个方法调用返回的是不同的结果,这里不多做解释。
使用该方法得到的字符串是定位到jar文件的,如果想只得到jar文件所在目录,那么需要对该字符串再做处理,或者在getLocation()方法返回的URL上作处理。另外注意,如果路径包含Unicode字符(汉字),那么还需要使用 java.net.URLDecoder.decode(path, “UTF-8″) 方法进行转码,其中path是需要转码的字符串路径。
方法二:使用JVM属性
String path = System.getProperty("java.class.path")
这里使用了java运行时的系统属性来得到jar文件的位置,结果同1方法大致相同,且不需要做转码处理。 更多系统属性参见Oracle的说明。在使用class测试时,该方法得到的路径为 “类库路径:当前class路径”(Windows系统应该显示”类库路径;当前class路径”),然而运行jar包时只会得到我期望的jar包路径,这一点有点不解。
从jar包路径的到jar包的目录,我的方法是:
int firstIndex = path.lastIndexOf(System.getProperty("path.separator"))+1
int lastIndex = path.lastIndexOf(File.separator) +1;
path = path.substring(firstIndex, lastIndex);
当然,如果是采用方法一,就不需要计算firstIndex了。
另外为了扫盲,注明下面这写忽悠人的错误做法
print(Thread.currentThread().getContextClassLoader().getResource(“”));
print(CurrentDirectory.class.getClassLoader().getResource(“”));
print(ClassLoader.getSystemResource(“”));
print(CurrentDirectory.class.getResource(“”));
print(CurrentDirectory.class.getResource(“/”));
print(new File(“”).getAbsolutePath());
print(System.getProperty(“user.dir”));