【问题标题】:Load file from same directory as jar-file从与 jar 文件相同的目录加载文件
【发布时间】:2012-05-14 23:16:21
【问题描述】:

我正在使用 log4j 进行日志记录。为了配置一切,我在 jar 文件之外创建了一个 log4j.xml。它工作得很好,但是当 jar 文件不是从 log4j.xml 所在的同一目录执行时会出现问题。

示例:jar 文件在 /opt/myapp/test.jar 中

user@host:/opt/myapp$ java -jar test.jar

效果很好,但是当我尝试这个时:

user@host:~$ java -jar /opt/myapp/test.jar

我收到一个找不到 log4j.xml 的错误。那是因为它正在我当前的工作目录中寻找它。

我还有一个在我的应用程序中使用的属性文件。该文件位于 jar 文件所在的 config/ 目录中,因此在此示例中为 /opt/myapp/config。尝试加载配置文件时会出现与上述相同的问题。

如何让 Java 从 jar 文件所在的目录加载文件(无论 jar 是从哪里执行的)?

可能很简单,但我想不通:(

【问题讨论】:

标签: java


【解决方案1】:

您需要使用命令行参数 -Dlog4j.configuration=/path/to/file 传递文件。

如果您需要更多选项,请查看the manual

【讨论】:

    【解决方案2】:
    1. 指定使用 log4j 系统属性,在命令的“-jar”部分之前添加: -Dlog4j.configuration=/opt/myapp/log4j.xml

    2. 将目录添加到类路径,在命令的“-jar”部分之前添加:

      -cp /opt/myapp/

    3. 您可以在代码中手动指定 log4j.xml 文件,然后相对于您的 jar 文件引用它。

      字符串路径 = ... ; PropertyConfigurator.configure(路径);

    【讨论】:

    • 第三个选项似乎是最简单的。
    【解决方案3】:

    最可靠的方法是询问 JVM 给定类的字节码来自哪里。

    请参阅http://www.exampledepot.com/egs/java.lang/ClassOrigin.html 了解此 sn-p:

    // Get the location of this class
    Class cls = this.getClass();
    ProtectionDomain pDomain = cls.getProtectionDomain();
    CodeSource cSource = pDomain.getCodeSource();
    URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/
    

    从 JAR 中加载时,您需要进行更多的后期处理。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        试试:

        java cp /opt/myapp/someohter.jar -jar /opt/myapp/test.jar
        

        使用属性来指定您自己、在哪里查找配置文件、资源等等(正如 Paulo 指出的那样)。

        将此类文件放在 jar.file 附近并根据您从哪里开始执行通常是一个坏主意。通常,安装应用程序的目录(jar)对用户是写保护的,但配置文件是可编辑的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-25
          • 2014-01-03
          • 1970-01-01
          • 2018-06-16
          • 2012-02-11
          • 2016-02-18
          • 1970-01-01
          相关资源
          最近更新 更多