2012-05-16 3 views
1

리플렉션을 사용하여 특정 패키지의 모든 디렉토리를 찾은 다음 해당 디렉토리를 java.io.Files로 반환하여 클래스 파일을 추출 할 수 있습니다. 패키지의 모든 디렉토리를 가져 오는 내 방법은 다음과 같습니다.Java : jar의 디렉토리를 가리키는 비 계층 적 URI에서 파일 만들기

private static List<File> findDirs(String packageName) throws IOException, 
     UnsupportedEncodingException, URISyntaxException { 
    List<File> result = new ArrayList<File>(); 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    assert classLoader != null; 

    String path = packageName.replace('.', '/'); 
    Enumeration<URL> resources = classLoader.getResources(path); 
    while (resources.hasMoreElements()) { 
     URL resource = resources.nextElement(); 
     URI uri = resource.toURI(); 
     File f = new File(uri);// this line throws the exception 
     result.add(f); 
    } 
    return result; 
} 

소스 코드에서 내 응용 프로그램을 실행할 때 완벽하게 작동합니다. 그러나 일단 그것을 배포하고 실행하면 File 생성자가 "URI is Hierarchical"인 IllegalArgumentsException을 throw하므로 findDirs 메서드가 실패합니다.

내가 코드를 디버그하는 한 문제를 일으키는 문제의 URI는 다음과 같습니다 jar:file:/C:/Program%20Files/apache-activemq-5.5.1/bin/../lib/App.jar!/com/demo/payload

소스에서 실행할 때 나는 URI 아무 문제가없는 반면 : file:/C:/Marcus/JavaProjects/App/build/prod/classes/com/demo/payload

을 어떻게 할 수 언급 한 것과 같은 비 herarchical URI에서 App.jar 내의 페이로드 디렉토리를 가리키는 파일을 생성 하시겠습니까?

JarURLConnection을 사용하여 App.jar 자체를 가리키는 JarFile을 만들면 검색 할 디렉토리를 가리키는 JarEntry를 가져올 수 있지만이 항목을 다음으로 변환 할 수는 없습니다. 파일 ...

답변

1

#getResources(String)에서 얻은 모든 것들을 File 참조에서받을 수 있다고 예상하는 것은 잘못입니다. 귀하의 경우에는 응용 프로그램/라이브러리의 Jar 파일 내의 참조입니다. 다음과 같이 URL에 액세스해야합니다. File을 건너 뛰려고 시도하는 대신 내용을 읽으려면 InputStream (URL#openStream)을 가져와야합니다.

File s를 얻으려면 인 jar URL을 볼 때 알아낼 필요가 있습니다. 그러면 JAR이 ZIP이기 때문에 ZIP에서 파일을 추출 할 수 있습니다. , 일급 시민 File.

+0

-1 (진술 한 내용이 유효 함에도 불구하고) 전혀 대답하지 않으므로 – stryba

+0

동의하지만 유감스럽게도 다른 사람들의 코드와 함께 작업하고 있으며 전체 수업을 다시 작성하지 않아도됩니다. findDirs 메서드를 사용하여 디렉토리를 가리키는 File을 반환합니다. 디렉토리가 Jar 또는 fileSystem에 있는지 여부를 확인하는 방법이 있습니까? –

+0

@stryba 우편 번호를 가져 오는 것에 대한 메모를 추가했습니다. 그러나 프로덕션 환경에서 권장하는 것은 아닙니다. 위험하므로 클래스 로더가 원격 데이터를 참조 할 수 있습니다. – Romain

0

jar 파일 내부를 가리킬 때마다 java.util.zip.ZipFile을 사용할 수 있습니다. 참조 된 jar 파일을 ZipFile에로드하고 그 중 getEntry 또는 entries을 사용하여 jar 내의 요소를 검색하십시오.

+0

질문의 끝에서 내가 파일을 만들려고하는 디렉토리에 해당하는 기본 Zipentry에 액세스 할 수 있다고했지만, 실제로이 항목에서 java.io.File 인스턴스를 만들 수 있습니까? –

+0

문제는'List '이 필요하고, 그 대신에'List '또는'List '이 필요하다는 것입니다. 'File'을 사용하면이 문제를 해결할 수 없습니다. – stryba

+0

기존 코드를 준수하려면'List '이 필요합니다. –

관련 문제