访问同一个 jar 中的属性文件
Access properties file in same jar
我们所有的 jar 都包含一个特定的文件 version.properties
,其中包含来自构建的特定信息。
当我们从命令行启动一个 jar 时(在 class 路径上有几个 jar),我们想从 相同的 访问 version.properties
罐。更准确地说:我们想编写 Java 代码,为我们提供调用 class 文件所在的 jar 中的属性文件的内容。
问题是 class 路径上的所有 jar 都包含 version.properties
并且我们不想读取 class 路径上的第一个而是来自正确 jar 的那个。我们怎样才能做到这一点?
有趣的问题。您必须找到特定 jar 的代表 class 的位置,并使用结果为属性文件构建 URL。我使用 String.class 作为示例拼凑了一个示例并在 META-INF 中访问 MANIFEST.MF,因为 rt.jar 中没有属性(至少快速 jar tf rt.jar | grep properties
导致零结果)
Class clazz = String.class;
String name = clazz.getName().replace('.', '/') + ".class";
System.out.println(name);
String loc = clazz.getClassLoader().getResource(name).toString();
System.out.println(loc);
if (loc.startsWith("jar:file")) {
String propertyResource = loc.substring(0, loc.indexOf('!')) + "!" + "/META-INF/MANIFEST.MF";
InputStream is = new URL(propertyResource).openStream();
System.out.println(propertyResource);
Properties props = new Properties();
props.load(is);
System.out.println(props.get("Implementation-Title"));
}
我们所有的 jar 都包含一个特定的文件 version.properties
,其中包含来自构建的特定信息。
当我们从命令行启动一个 jar 时(在 class 路径上有几个 jar),我们想从 相同的 访问 version.properties
罐。更准确地说:我们想编写 Java 代码,为我们提供调用 class 文件所在的 jar 中的属性文件的内容。
问题是 class 路径上的所有 jar 都包含 version.properties
并且我们不想读取 class 路径上的第一个而是来自正确 jar 的那个。我们怎样才能做到这一点?
有趣的问题。您必须找到特定 jar 的代表 class 的位置,并使用结果为属性文件构建 URL。我使用 String.class 作为示例拼凑了一个示例并在 META-INF 中访问 MANIFEST.MF,因为 rt.jar 中没有属性(至少快速 jar tf rt.jar | grep properties
导致零结果)
Class clazz = String.class;
String name = clazz.getName().replace('.', '/') + ".class";
System.out.println(name);
String loc = clazz.getClassLoader().getResource(name).toString();
System.out.println(loc);
if (loc.startsWith("jar:file")) {
String propertyResource = loc.substring(0, loc.indexOf('!')) + "!" + "/META-INF/MANIFEST.MF";
InputStream is = new URL(propertyResource).openStream();
System.out.println(propertyResource);
Properties props = new Properties();
props.load(is);
System.out.println(props.get("Implementation-Title"));
}