jar包路径问题

转载 2015年07月09日 15:22:45

开发完毕后,我们经常会将我们的程序打包成可运行jar文件,或者是war包。如果程序内部需要明确知道当前jar包所处的位置,下面是几种方法:



获取JAR包路径和所在目录的几种方法

之前转过一篇文章(读取jar包中资源文件的几个方法),详细介绍了如何读取保存在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了。

另外为了扫盲,注明下面这写忽悠人的错误做法(摘自http://shallway.net/blog/?p=136):

  1.         print(Thread.currentThread().getContextClassLoader().getResource(“”));
  2.         print(CurrentDirectory.class.getClassLoader().getResource(“”));
  3.         print(ClassLoader.getSystemResource(“”));
  4.         print(CurrentDirectory.class.getResource(“”));
  5.         print(CurrentDirectory.class.getResource(“/”));
  6.         print(new File(“”).getAbsolutePath());
  7.         print(System.getProperty(“user.dir”));

redis的Java客户端jedis池的介绍及使用

一、jedis池的介绍 相信大家都用过线程池或者是jdbc的连接池,使用池可以减少系统在使用所需对象时创建对象的开销,从而提高系统性能和效率。jedis池也是如此,那么我们该如何使用jedis池...
  • softwave
  • softwave
  • 2015年01月01日 17:38
  • 13966

获取jar包中的文件路径

/**-----------------------------------------------------------------------      *getAppPath需要一个当前程序...
  • u010649589
  • u010649589
  • 2017年09月30日 11:30
  • 95

JAR包文件路径问题

问题描述:源码读取文件内容OK,但是打成jar包后,导入到另外一个工程中后,读取文件内容出错,java.io.FileNotFoundException:找不到文件?! 解决方案:读取jar包中文件内...
  • liuweibirthday
  • liuweibirthday
  • 2010年04月17日 13:51
  • 4079

java jar 配置文件的相对路径问题

命令行运行jar包,如何使用与jar包在同一个目录的配置文件。 其实就是当前的工作目录问题。 在eclipse中:String resource = "conf.xml";//此时文件是在src目...
  • u010902721
  • u010902721
  • 2016年05月05日 14:34
  • 5251

java中jar包内的类访问jar包内部的资源文件的路径问题

在本地项目中,若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities("user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为...
  • mm_bit
  • mm_bit
  • 2015年12月21日 16:37
  • 14979

获得执行jar的运行路径

题记 上一篇使用了一个叫fat-jar的插件来制作jar包,确实很方便。但我们更容易遇到另一个更为棘手的问题!如何得到jar包的运行路径? 如果没有这个路径,我们读取文件可能找不到路径,写文件可能...
  • whuslei
  • whuslei
  • 2012年03月09日 20:31
  • 27724

maven打包,实现将jar包中的路径,打到对应的目录下

如果你想通过pom.xml文件的配置实现的话,你可以这样 1、打jar包时过滤配置文件 src/main/resources **/* true       ...
  • wangliutao1
  • wangliutao1
  • 2017年03月04日 10:59
  • 1705

资源文件一块打包成jar,调用时找不到文件

http://www.cnblogs.com/tqsummer/archive/2011/02/16/1956111.html
  • zlc819240815
  • zlc819240815
  • 2016年10月16日 12:13
  • 548

打包后jar包中文件读取问题

1、jar包中原来的文件夹被打包放到工程中,文件夹会变成包package 2、读取jar包中的文件,必须使用ClassLoader.getResource(fileName) 或者 ClassLoa...
  • xubo_ob
  • xubo_ob
  • 2016年10月11日 17:04
  • 1659

java图片在jar包中路径问题

java图片在jar包中路径问题 因为Windows和linux上的路径有差异,而且自己项目路径和linux服务器上的路径不一定相同。最近要做个需求,动态的生成pdf文件供前台页面下载,我利用it...
  • tanqian351
  • tanqian351
  • 2016年04月19日 16:13
  • 1128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jar包路径问题
举报原因:
原因补充:

(最多只允许输入30个字)