Thread.currentThread().getContextClassLoader().getResource(".") 在Windows和Linux上的结果不同。

3

我有一个简单的Java类:

public class T {
    public static void main(String[] args) {
        System.err.println(Thread
              .currentThread()
              .getContextClassLoader()
              .getResource("."));
    }
}

在Windows上运行上述类时,我得到了以下结果:
file:/T:/java/

在Linux上运行时,我得到了不同的东西:
jar:file:/usr/lib/jvm/java-6-openjdk-common/jre/lib/ext/pulse-java.jar!/

这个问题导致我的程序在Linux上失败,因为它找不到我指定的文件。有什么解决方法吗?

2
你期望 "." 返回什么? - jtahlborn
Java程序启动时的当前文件夹。实际上这并不重要,我想使用Thread.currentThread.getContextClassLoader().getResource("app.conf")获取app.conf文件。在Windows上可以工作,但在Linux上不能。 - Gelin Luo
一定要喜欢那个方法的文档:“资源的名称是一个由'/'分隔的路径名,用于标识该资源。” 因此,名称是一个字符串,其中可能包含'/'字符。 - Tom Hawtin - tackline
1
当前目录?为什么不直接使用File呢?资源是关于加载程序中的“文件”。在生产部署中,当前工作目录不太可能在类路径上(也许不在)。 - Tom Hawtin - tackline
正如我所说,当前工作目录仅用于测试API在两个环境中的行为,这并不重要。我想使用程序加载配置文件,该文件可能存在于当前目录或lib的jar文件根目录中。 - Gelin Luo
2
经典的XY问题。请编辑您的问题,包含您最后一条评论的内容,因为那似乎是您实际的目标。 - Duncan Jones
1个回答

2

程序的当前目录可能在类路径中,也可能不在其中,这要取决于程序的执行方式。如果您需要获取一个可能在 Jar 文件中或者当前目录中的文件,则应该进行两个单独的检查:

  1. 首先检查类路径
  2. 如果未找到,则检查当前目录(使用 new File("") 可以获取当前工作目录)。

谢谢,我该如何获取正在运行的程序的类路径根目录? - Gelin Luo
1
例如,假设类路径根目录为./target/test-classes,我想从Java应用程序中获取一个名为./target/test-classes/resources的文件夹,该如何实现? - Gelin Luo
@绿色 - 你为什么要获取根类路径的目录?程序可能正在运行来自没有根目录的jar文件。 - jtahlborn
这是我运行单元测试用例的情况,程序没有从jar文件启动。 - Gelin Luo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接