【问题标题】:Is it possible load all properties files contained in a package dynamically? i.e. MyClass.class.getResource('*.properties');是否可以动态加载包中包含的所有属性文件?即 MyClass.class.getResource('*.properties');
【发布时间】:2011-02-26 23:16:58
【问题描述】:

我熟悉在给定文件名的情况下获取属性文件的内容,显然 MyClass.class.getResource('*.properties') 不起作用,但我怎样才能获得所有属性的列表与我的班级位于同一包中的文件?

【问题讨论】:

  • 这对于 Spring 来说很容易,所以如果你使用它的机会不大,我可以给你一个基于 Spring 的答案。
  • 好的...所以我开始认为这是不可能的。据我了解,Java 使用延迟类加载,因此类加载器在被要求检索类之前不知道包中的内容。我能想出的最接近的方法是 attempt 将包名解析为目录,获取道具列表。目录中的文件,并尝试通过 class.getResource() 加载它们。我知道这是一个黑客;有没有更好的办法?
  • 啊哈!听起来它会起作用,任何使用 Spring 的回答都是可以接受的,将不胜感激
  • 请使用@nickname 发布目标cmets,例如@skaffman,以便他得到通知:) 是的,使用java.io.File 和配偶这样做很讨厌。是的,Spring 解决方案会更好。
  • @skaffman 您可以提供的任何 Spring 解决方案都会非常有帮助。感谢您的宝贵时间

标签: java jakarta-ee properties classpath classloader


【解决方案1】:

假设它不是 JAR 打包的,你可以使用 File#listFiles() 来做这个。这是一个启动示例:

String path = MyClass.class.getResource("").getPath();
File[] propertiesFiles = new File(path).listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.endsWith(".properties");
    }
});

如果它是 JAR 打包的,那么您需要更多代码,以 JarFile API 开头。您可以在this answer 中找到另一个示例。

【讨论】:

  • 抱歉,不允许使用文件。班级目前不在罐子里……但我不知道班级的未来会怎样,而且我无法控制将要运行的环境,因此需要尽可能地解耦
【解决方案2】:

你可以用 Spring 来做这些事情。请参阅4. Resources,特别是(或值得注意?)(或主要是?)(或主要是?)4.7.2 Wildcards in application context constructor resource paths。

【讨论】:

  • 诅咒,有人偷了我的风头 :) 吃一块饼干。 +1
【解决方案3】:

我就是这样做的,

Class<? extends Object> clazz = AnyKnownClassInTheJar.class;
String classFileName = clazz.getSimpleName() + ".class";
URL classResource = clazz.getResource(classFileName);
if (!"jar".equals(classResource.getProtocol())) {
    // Class not from JAR
    return;
}
JarURLConnection classConnection = (JarURLConnection)classResource.openConnection();
JarFile jar = classConnection.getJarFile();
for (Enumeration<JarEntry> i = jar.entries(); i.hasMoreElements();) {
    JarEntry entry = i.nextElement();
    if (entry.getName().endsWith(".properties")) {
        // Load the property file
    }
}

【讨论】:

  • 太棒了!这甚至适用于Android。诀窍是从classResource = AnyClassInTheApp.class.getResource("/AndroidManifest.xml") 开始。 jar 中列出的条目将是 APK 内容。
猜你喜欢
  • 2010-10-01
  • 2013-11-29
  • 2021-10-15
  • 2010-11-20
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多