最近写了个简单的定时执行文件,5分钟做一次,调用外部bat,打log等。最后整个source打成jar。
调用外部文件exec("abc.bat"),log4j中log4j.A.File = log.log等。都是相对路径的。
下面说下现象(bat文件放在jar的相同目录下):
windows下双击运行这个jar,调用bat文件OK,打log也OK,生成的log文件跟jar路径一致。
在cmd中打java -jar .... 运行,报错bat文件找不到,log也打在了jar所在磁盘的根目录下
这两种运行方式对路径有什么影响?望高手赐教。
另外:linux中用终端打java -jar .... 运行,报bat文件找不到,log打在/root下。

解决方案 »

  1.   

    当前目录的问题,你用System.out.println(new File("."));就看到目录是什么了。
    取当前jar包的路径,如果是我我会用ClassLoader.getResource("jar包中的某个文件")来获得一个URL。解析此URL就能得到当前jar包的绝对路径。
      

  2.   

    写了一个小方法可以取到绝对路径,但感觉绝对路径总是不那么稳妥的 public static String getJarPath() {
            String path = null;
            URL url = new MainForm().getClass().getProtectionDomain().getCodeSource().getLocation();
            path = url.toString().replaceFirst("file:", "");
            path = path.replaceFirst("XXX.jar", "");
            return path;
    }
      

  3.   

    写了一个小方法可以取到绝对路径,但感觉绝对路径总是不那么稳妥的 public static String getJarPath() {
            String path = null;
            URL url = new MainForm().getClass().getProtectionDomain().getCodeSource().getLocation();
            path = url.toString().replaceFirst("file:", "");
            path = path.replaceFirst("XXX.jar", "");
            return path;
    }
      

  4.   

    程序运行都有个当前路径的问题,双击情况下当然程序路径和当前路径是一样的,java命令行运行可能就会不同,可以用代码获得,楼上的没试过。下面是我用过的。
    File path = new File(this.getClass().getResource("").getPath());
    path.getAbsolutePath()这个是当前类的本地路径,可以基于这个路径做查找,如:
    path.getParentFile().getAbsolutePath();就是上级目录的路径。