2012-12-11 2 views
1

Maven 프로필과 JAR 빌드를 사용하는 Java 응용 프로그램을 만들고 있습니다.JAR 내 리소스 액세스

나는이 폴더에 일부 XML 파일이 있습니다. 프로젝트/SRC/메인/자원/XML/* XML

src/main/resources 폴더 그래서 나는 내 프로젝트 내 빌드 경로에서 소스 폴더가 있습니다 .jar/XML/*. xml은 JAR 바이너리로 빌드됩니다.

JAR 실행에서 "/XML/*.xml"파일을 찾아서 나열하고 싶습니다. 내 구조가 이것에 좋은가요?

Maven 프로파일로 실행해도 문제가 없지만 파일을 찾아 나열하는 좋은 방법을 찾을 수 없습니다. 당신이 당신의 jar 파일의 내용을 나열하려면

+0

가능한 중복 : http://stackoverflow.com/questions/2639943/accessing-jar-resources –

+0

는 내가 전에 그 질문을 본 적이 있지만 그들은 패턴을 사용하지 않는 "XML/* XML을." . 나는 이것이 이것이 주된 문제라고 생각한다. – Dough

답변

0

, 그냥 간단하게 실행할 수 있습니다 :

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

이 코드는 앱의 클래스 경로에서 항아리의 경로를 찾고 폴더의 내용을 나열하는 방법을 보여줍니다.

// 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에 대한 종속성에 신경 쓰지 않는다면 JAR과 디렉토리의 차이점에서 추상화 된 멋진 PathMatchingResourcePatternResolver을 가지고 있습니다.

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