访问JAR中的资源

时间:2012-12-11 08:43:25

标签: java jar embedded-resource

我正在创建一个使用Maven配置文件和JAR构建的Java应用程序。

我在这个文件夹中有一些XML文件:project / src / main / resources / XML / * .xml

src / main / resources文件夹是我构建路径中的源文件夹,所以我在JAR二进制文件中构建了project.jar / XML / * .xml。

我希望能够在JAR执行中找到并列出这些文件“/XML/*.xml”。我的结构对此有好处吗?

使用Maven配置文件运行没有问题,我找不到找到并列出这些文件的好方法。

3 个答案:

答案 0 :(得分:2)

没有真正的方式。如果你不介意对spring-core的依赖,那么他们有一个很好的PathMatchingResourcePatternResolver,它可以抽象出JAR和目录之间的差异。

PathMatchingResourcePatternResolver resolver =
   new PathMatchingResourcePatternResolver(MyClass.class.getClassLoader());
Resource[] xmls = resolver.getResources("classpath*:XML/*.xml");

答案 1 :(得分:0)

如果要列出jar文件的内容,只需运行:

即可
jar tf ./path/to/your/file.jar

jar tf ./path/to/your/file.jar | grep XML

现在来自代码(我相信这不是唯一的方法)并且您必须将Main替换为jar中的任何类:

              List<String> myJarXmlFiles = new ArrayList<String>();
    try {
                       // replace Main here   
        CodeSource src = Main.class.getProtectionDomain().getCodeSource();
        if (src != null) {
            URL jar = src.getLocation();
            ZipInputStream zip = new ZipInputStream(jar.openStream());
            ZipEntry entry = null;
            while ((entry = zip.getNextEntry()) != null) {
                if (entry.getName().contains("XML/")
                        && entry.getName().endsWith(".xml")) {
                    myJarXmlFiles.add(entry.getName());
                }
            }
        } else {
            // failed
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

答案 2 :(得分:0)

此代码演示了如何在应用程序的类路径中找出jar的路径并列出文件夹的内容。

// you need to get of a URL of any class in your jar
URL url = Appender.class.getProtectionDomain().getCodeSource()
           .getLocation();
File file = new File(url.getFile());
System.out.println(file.getCanonicalPath());
JarFile jar = new JarFile(file);
Enumeration<JarEntry> i = jar.entries();
while (i.hasMoreElements()) {
    JarEntry e = i.nextElement();
    if (e.getName().startsWith("META-INF/")) {
        System.out.println(e.getName());
    }
}
jar.close();

输出

jar:file:/C:/temp/.repository/log4j/log4j/1.2.17/log4j-1.2.17.jar!/org/apache/log4j/Appender.class
C:\temp\.repository\log4j\log4j\1.2.17\log4j-1.2.17.jar
META-INF/MANIFEST.MF
META-INF/
META-INF/LICENSE
META-INF/NOTICE
META-INF/maven/
META-INF/maven/log4j/
META-INF/maven/log4j/log4j/
META-INF/maven/log4j/log4j/pom.properties
META-INF/maven/log4j/log4j/pom.xml
相关问题