在同一个罐子中访问属性文件

问题描述:

我们所有的罐子都包含一个特定的文件version.properties,其中包含来自版本的特定信息。在同一个罐子中访问属性文件

当我们从命令行启动一个罐子(在类路径上有几个罐子)时,我们想从获得version.properties罐子的相同。更确切地说:我们希望编写Java代码,它将调用类文件所在的jar文件中的属性文件的内容提供给我们。

问题是类路径上的所有jar包含version.properties,我们不想读取类路径中的第一个,但是从正确的jar中读取第一个。我们如何实现这一目标?

+0

Java使用包有很好的理由。为什么不在适当的包中设置version.properties? –

+0

version.properties位于每个jar的主目录中 - 这是不能更改的(公司标准) –

+0

您将无法使用类加载器来执行此操作。相反,你必须使用肮脏的技巧来找出类来自哪里(如果有的话),然后打开一个jar输入流到该jar并查找version.properties条目,然后阅读此条目。或者你可以改变公司的标准,使其成为可用的标准。 –

有趣的问题。您必须找到特定jar的代表类的位置,并使用结果来构建属性文件的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")); 
    }