Standard/Uniform JAR文件内外定位文件的方法?

Standard/Uniform way to locate files inside and outside JAR file?

定位然后访问 JAR 文件内部和外部文件的统一或标准方法是什么。

我在包含配置文本文件的 JAR 文件中定义了 InJarClass()。 然后我在我的主机项目中扩展这个 class,它有更多的配置。

假设我在 JAR 中有:

config/default.conf

然后在我做的宿主项目中:

class MyClass extends InJarClass { .... }

还有:

config/test.conf

然后我 运行 它是这样的 :

XENV=测试java我的class

整个配置过程发生在 InJarClass() 内部,基于环境 XENV。 如您所见,InJarClass() 必须访问两者:

<jar>/config/default.conf
<host_app_dir>/config/test.conf

所以重复我的问题,如果目录结构相互镜像,是否有统一的方式来访问两者。

如果将当前目录和 .jar 文件都放在类路径中:

XENV=test java -classpath .:myjarfile.jar MyClass

你可以这样做:

String configFile =
    "/config/" +
    System.getenv().getOrDefault("XENV", "default") +
    ".conf";

InputStream config = MyClass.class.getResourceAsStream(configFile);

if (config == null) {
    throw new FileNotFoundException(
        "Cannot locate " + configFile + " in classpath");
}

这是可行的,因为应用程序资源是 Java 在类路径中的每个位置搜索的资源。所以 getResourceAsStream 会首先搜索相对于第一个类路径位置 . 的请求路径。如果它没有找到具有该名称的文件,它将查看第二个类路径位置 myjarfile.jar,并看到它是一个 .jar 文件,将在 中搜索请求的文件 那个.jar.