2012-12-11 41 views
1

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

我有一些XML文件,此文件夹中:项目/ src目录/主/资源/ XML/* XML

在src /主/资源文件夹在我的构建路径源文件夹,所以我有我的项目.jar/XML/*。xml内置于JAR二进制文件中。

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

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

+0

可能重复:http://stackoverflow.com/questions/2639943/accessing-jar-resources –

+0

我以前见过这个问题,但他们不使用模式“XML/* XML。” 。我认为这是这里的主要问题。 – Dough

回答

0

如果你想列出你的JAR文件的内容,你可以只简单地运行:

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

jar tf ./path/to/your/file.jar | grep XML 
从代码

现在(我相信这不是唯一的方法做它),你必须替换Main与你在任何类是在罐内:

   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(); 
    } 
} 
+0

这将在从JAR运行时运行,但在运行调试时不会运行。 – Dough

+0

这就是OP请求的内容:/ –

+0

这让我很尴尬,因为我希望在从Eclipse启动应用程序时访问这些文件。这是没有办法吗? – Dough

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 
2

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

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