获取当前jar包的绝对路径

时间:2021-11-14 22:20:36

        好久没来CSDN了诶嘿o(≧v≦)o

        事情的起因是这样的,最近在编写的Java程序,想要在crontab下定时运行。

        稍微了解Linux的人都知道,Linux的crontab下运行程序的话,路径是一个容易坑的问题。crontab内的程序运行的路径不是程序所在的路径,这就造成一个麻烦的地方,假如jar包的位置并不确定,而jar包又需要读取同目录的文件,那么我能想到的比较快速的修补办法有:

        (1)在crontab下运行jar包的指令前面,添加进入jar包目录的语句

        (2)写一个shell脚本,在运行jar包前添加:cd `dirname $0`


        唔嗯……从高内聚低耦合的角度来说,这样的修补办法让人觉得有些不舒服。于是,有没有什么办法,能让jar包读取它自身所在的绝对路径呢?

        以下就是jar包获取自身所在文件夹的绝对路径的代码:

        String jarWholePath = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();
        try {
            jarWholePath = java.net.URLDecoder.decode(jarWholePath, "UTF-8");
        } catch (UnsupportedEncodingException e) { System.out.println(e.toString()); }
        String jarPath = new File(jarWholePath).getParentFile().getAbsolutePath();
        我来逐行解释一下这些内容吧:

        第1行:

            这一行获取了MyClass这个类所在的jar包的绝对路径。

            举个例子来说,假如有一个名为MyClass的类,最后输出到了名为myJar.jar的jar包,该jar包现在放在C:\,那么这一行得到的内容就是:/C:/myJar.jar。

        第2~4行:

            这些行做了对jarWholePath这个String变量的转码。

            如果路径完全是英语字符组成的,那么转码前后看起来是一样的;如果在路径中含有中文字符的话,那么这层转码就是必须的了,不转码就会让中文字符形成乱码。

        第5行:

            这一行获取了jar包所在的文件夹的绝对路径。

            还是接着第1行的例子,这一行得到的结果是:C:/。

        以上就是对这段小代码的解释。通过这段代码,我们就得到了jar包所在文件夹的位置,并且存储到了jarPath这个变量中。


        写完之后还想讲两句闲话。

        java的java.io.File类对文件操作和查看文件属性的功能还是比较完备的,一些常见的操作都可以直接调用函数。

        像是这段小代码里最后一行,在通过new File(jarWholePath)得到一个File对象之后,对于文件的操作,包括获取绝对路径、获取上一级文件夹,等等,都可以任意调用函数。对于程序的快速开发,这是很好的帮助。