리플렉션을 사용하여 특정 패키지의 모든 디렉토리를 찾은 다음 해당 디렉토리를 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 (진술 한 내용이 유효 함에도 불구하고) 전혀 대답하지 않으므로 – stryba
동의하지만 유감스럽게도 다른 사람들의 코드와 함께 작업하고 있으며 전체 수업을 다시 작성하지 않아도됩니다. findDirs 메서드를 사용하여 디렉토리를 가리키는 File을 반환합니다. 디렉토리가 Jar 또는 fileSystem에 있는지 여부를 확인하는 방법이 있습니까? –
@stryba 우편 번호를 가져 오는 것에 대한 메모를 추가했습니다. 그러나 프로덕션 환경에서 권장하는 것은 아닙니다. 위험하므로 클래스 로더가 원격 데이터를 참조 할 수 있습니다. – Romain