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.
定位然后访问 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.