Java Jar 파일 : 자원 사용 오류 : URI가 계층 적이 지 않습니다.
내 앱을 jar 파일에 배포했습니다. 리소스의 한 파일에서 jar 파일 외부로 데이터를 복사해야 할 때 다음 코드를 수행합니다.
URL resourceUrl = getClass().getResource("/resource/data.sav");
File src = new File(resourceUrl.toURI()); //ERROR HERE
File dst = new File(CurrentPath()+"data.sav"); //CurrentPath: path of jar file don't include jar file name
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
// some excute code here
내가 만난 오류는 URI is not hierarchical
. 이 오류는 IDE에서 실행할 때 만나지 않습니다.
StackOverFlow의 다른 게시물에 대한 도움말로 위의 코드를 변경하면 :
InputStream in = Model.class.getClassLoader().getResourceAsStream("/resource/data.sav");
File dst = new File(CurrentPath() + "data.sav");
FileOutputStream out = new FileOutputStream(dst);
//....
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) { //NULL POINTER EXCEPTION
//....
}
너는 이것을 못해
File src = new File(resourceUrl.toURI()); //ERROR HERE
파일이 아닙니다! IDE에서 실행할 때 jar 파일을 실행하지 않기 때문에 오류가 없습니다. IDE에서 클래스와 리소스는 파일 시스템에서 추출됩니다.
그러나 다음 InputStream
과 같이 열 수 있습니다 .
InputStream in = Model.class.getClassLoader().getResourceAsStream("/data.sav");
제거 "/resource"
. 일반적으로 IDE는 파일 시스템 클래스와 리소스에서 분리됩니다. 그러나 항아리가 만들어지면 그것들은 모두 합쳐집니다. 따라서 폴더 수준 "/resource"
은 클래스 및 리소스 분리에만 사용됩니다.
클래스 로더에서 리소스를 가져올 때 리소스가 jar 내부에있는 경로, 즉 실제 패키지 계층 구조를 지정해야합니다.
어떤 이유로 java.io.File
Jar 파일 내의 리소스를 가리키는 객체 를 만들어야하는 경우 답은 여기에 있습니다. https://stackoverflow.com/a/27149287/155167
File f = new File(getClass().getResource("/MyResource").toExternalForm());
다음은 Eclipse RCP / Plugin 개발자를위한 솔루션입니다.
Bundle bundle = Platform.getBundle("resource_from_some_plugin");
URL fileURL = bundle.getEntry("files/test.txt");
File file = null;
try {
URL resolvedFileURL = FileLocator.toFileURL(fileURL);
// We need to use the 3-arg constructor of URI in order to properly escape file system chars
URI resolvedURI = new URI(resolvedFileURL.getProtocol(), resolvedFileURL.getPath(), null);
File file = new File(resolvedURI);
} catch (URISyntaxException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
FileLocator.toFileURL(fileURL)
대신 사용하는 것이 매우 중요 resolve(fileURL)
합니다. 플러그인이 jar에 압축되면 Eclipse가 임시 위치에 압축 해제 된 버전을 만들어 파일을 사용하여 개체에 액세스 할 수 있도록합니다. 예를 들어 Lars Vogel은 그의 기사 ( http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/)에 오류가있는 것 같습니다.
While I stumbled upon this problem myself I'd like to add another option (to the otherwise perfect explanation from @dash1e):
Export the plugin as a folder (not a jar) by adding:
Eclipse-BundleShape: dir
to your MANIFEST.MF
.
At least when you export your RCP app with the export wizard (based on a *.product
) file this gets respected and will produce a folder.
In addition to the general answers, you can get "URI is not hierarchical" from Unitils library attempting to load a dataset off a .jar
file. It may happen when you keep datasets in one maven submodule, but actual tests in another.
There is even a bug UNI-197 filed.
I got a similiar issues before, and I used the code:
new File(new URI(url.toString().replace(" ","%20")).getSchemeSpecificPart());
instead of the code :
new File(new URI(url.toURI())
to solve the problem
ReferenceURL : https://stackoverflow.com/questions/10144210/java-jar-file-use-resource-errors-uri-is-not-hierarchical
'developer tip' 카테고리의 다른 글
Meteor가 실행되는 동안 다른 클라이언트에서 Meteor의 MongoDB에 어떻게 액세스합니까? (0) | 2021.01.11 |
---|---|
파이썬에서 고정 크기 형식의 문자열을 어떻게 만듭니 까? (0) | 2021.01.11 |
PowerShell로 문자열을 분할하고 각 토큰으로 작업 수행 (0) | 2021.01.11 |
Android에서 파일 생성 시도 : 열기 실패 : EROFS (읽기 전용 파일 시스템) (0) | 2021.01.11 |
bitbucket으로 푸시 할 수 없습니다. 권한이 거부되었습니다 (공개 키). (0) | 2021.01.11 |