今天找了半天的毛病 关于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”));