【问题标题】:How can I discover resources in a Java jar with a wildcard name?如何在带有通配符名称的 Java jar 中发现资源?
【发布时间】:2010-09-13 02:11:16
【问题描述】:

我想发现我的 ClassLoader 使用通配符模式知道的所有 xml 文件。有没有办法做到这一点?

【问题讨论】:

    标签: java classpath


    【解决方案1】:

    Spring ApplicationContext 可以轻松做到这一点:

     ApplicationContext context = new ClassPathXmlApplicationContext("applicationConext.xml");
     Resource[] xmlResources = context.getResources("classpath:/**/*.xml");
    

    请参阅ResourcePatternResolver#getResourcesApplicationContext

    【讨论】:

    • 在最近的 Spring 中,该模式将不起作用。前缀必须是 classpath*: 才能在 jar 中查找资源。这至少有一个war文件和一个包含xml文件的jar库。
    【解决方案2】:
     List<URL> resources = CPScanner.scanResources(new PackageNameFilter("net.sf.corn.cps.sample"), new ResourceNameFilter("A*.xml"));
    

    把 sn-p 放到你的 pom.xml 中

    <dependency>
        <groupId>net.sf.corn</groupId>
        <artifactId>corn-cps</artifactId>
        <version>1.0.1</version>
    </dependency>
    

    【讨论】:

    • 这似乎是最简单的解决方案之一。截至 2014 年 8 月 20 日,最新版本是 1.1.7 在 maven Central 中。
    【解决方案3】:

    这需要一点技巧,但这里有一个相关的blog entry。您首先找出罐子的 URL,然后打开罐子并扫描其内容。我想你会通过查找“/META-INF/MANIFEST.MF”来发现所有 jar 的 URL。目录将是另一回事。

    【讨论】:

    • 这看起来可行,但需要进行大量搜索才能找到我想要的文件名。我认为在构建时创建一个包含我正在查看的文件的文件会更容易。这个新文件有一个已知的名称,可以使用 ClassLoader 找到。
    【解决方案4】:

    JAR 文件只是另一个 ZIP 文件,对吗?

    所以我想你可以使用 http://java.sun.com/javase/6/docs/api/java/util/zip/ZipInputStream.html 迭代 jar 文件

    我在想这样的事情:

    ZipSearcher searcher = new ZipSearcher(new ZipInputStream(new FileInputStream("my.jar"))); List xmlFilenames = searcher.search(new RegexFilenameFilter(".xml$"));

    干杯。基思。

    【讨论】:

      【解决方案5】:

      嗯,它不是来自 Java,而是

      jar -tvf jarname | grep xml$

      将显示 jar 中的所有 XML。

      【讨论】:

      • 不幸的是,我需要 Java 中的解决方案。
      猜你喜欢
      • 2018-02-24
      • 2021-11-08
      • 1970-01-01
      • 2023-03-26
      • 2012-04-09
      • 2014-04-12
      • 2018-02-26
      • 2014-02-03
      • 1970-01-01
      相关资源
      最近更新 更多