2014-04-21 4 views
0

나는 외부 라이브러리에 의존하고 template.pdf이라는 리소스를 포함하는 자바 프로젝트를 가지고있다. 라이브러리는 내 작업 영역 외부의 폴더에 있으며 Project -> Properties -> Build Path -> Libraries -> Add External Jar을 사용하여 프로젝트에서 참조합니다. 리소스 파일은 현재 내 작업 공간의 bin/ 폴더에 있으므로 PDFProject.class.getResourceAsStream("/template.pdf")을 사용하여 액세스 할 수 있습니다.이 파일은 아래의 방법 1을 사용하여 JAR 파일을 내보내는 것으로 가정하고 Eclipse 및 JAR 파일에서 모두 작동합니다.JAR에 자원과 종속성을 포함시키는 방법은 무엇입니까?

내 목표는 리소스와 의존성을 모두 포함하는 JAR로 프로젝트를 내보내는 동시에 리소스 액세스에 사용되는 코드를 변경하지 않고 Eclipse와 JAR 내부에서 코드를 실행할 수있게하는 것이다. 또는 파일의 사본을 여러 개 유지해야하는 경우. 지금까지 나는 시도했다 :

  1. 가 알렸던 Export all output folders for checked projects 상자 Export -> JAR file를 사용하여 내보내기. 그러면 리소스 파일이 포함 된 JAR이 내보내지고 이클립스와 JAR의 동일한 경로 ("/template.pdf")를 사용하여 리소스에 액세스 할 수 있지만 JAR 내부의 종속성 패키지 옵션은 제공되지 않습니다.
  2. [Extract/Package] required libraries into generated JAR 옵션이 선택된 Export -> Runnable JAR file을 사용하여 내보내기. 이렇게하면 내부의 종속 항목과 함께 jar 파일이 내보내 지지만 리소스 파일은 제외됩니다.
  3. 리소스 파일을 프로젝트의 src/ 디렉터리로 이동 한 다음 위의 방법 2를 사용하여 내 보냅니다. 이것은 정확하게 자원과 의존성을 JAR에 패키징하지만, 코드는 "/template.pdf"이 더 이상 class-path에 없으므로 수정없이 Eclipse에서 실행되지 않습니다.

은 내가 수동으로 수출 후 JAR에 자원을 배치하거나 bin/src/ 모두에서 리소스 파일의 복사본을 유지하거나 직접 내 프로젝트에 라이브러리의 소스를 복사 할 수 있음을 인식하지만, 이러한 솔루션은 비효율적 인 것 같습니다 일반적인 관행으로. 대부분의 검색에서 Ant 또는 Maven과 같은 빌드 도구가 허용 가능한 솔루션을 제공 할 수 있음을 나타내는 것으로 보이지만 가능한 경우이 시점에서 학습 곡선을 다루지 않는 것이 좋습니다. 기본 Eclipse 내보내기 옵션과 폴더 계층 구조 만 사용하여 위에 지정된대로 JAR 파일을 만드는 방법이 있습니까?

편집 : 아래의 Thorbjørn Ravn Andersen의 의견은 리소스 파일을 프로젝트에 추가하는 방법과 관련하여 내 큰 실수를 발견하는 데 도움이되었습니다. Eclipse의 가져 오기 기능을 사용하는 대신 필자는 OS를 통해 파일을 원본 폴더에 수동으로 복사 한 다음 오른쪽 클릭 메뉴에서 새로 고침을 사용하여 Eclipse의 패키지 탐색기를 업데이트했습니다. 나는이 프로젝트가 필요한 업데이트를 수행 할 것이라고 잘못 생각했다. 그러나 나중에 파일을 출력 폴더에 반영하도록 프로젝트를 정리해야했다. (또는 가져 오기 기능을 사용하여 첫 번째 파일을 추가했다. 장소).

원본 폴더에있는 리소스 파일의 복사본 만 유지하면되므로 문제가 해결되지만 디스크에 파일의 복사본이 여러 개 생성됩니다. 내 작은 프로젝트에 대해서는 문제가되지 않습니다. 그러나 많은 리소스 파일이있는 대규모 프로젝트의 경우 중복 파일에 많은 디스크 사용량이 발생할 수 있습니다. 분명히 중복없이 비슷한 결과를 얻을 수있는 방법이 있어야만합니까?

+0

당신이 Thorbjørn Ravn 안데르센 @ 프로젝트 –

+0

를 청소하지 않는 경우 그래서 현재 jar 파일이 사라 - 내가 청소하면 파일이 사라지고 없음 항아리,하지만 빈에서 template.pdf 파일을/ – Houser

+0

새 원본 폴더를 만들고 template.pdf를 그 안에 복사하십시오. –

답변

0

새 원본 폴더를 만들고 그 아래에 template.pdf를 넣으십시오. 그런 다음 resourceAsStream()을 변경하여 새 폴더 이름도 포함시킵니다.

getResourceAsStream ("\ resources \ template.pdf ")

+0

Eclipse에서 실행할 때 getResourceAsStream()은 Eclipse에서 실행할 때 "/bin /"(새 소스 폴더가 생성 된 " /"이 아님) 인 class-path를 검색하기 때문에이 기능은 작동하지 않습니다. . 또한이 구성으로 프로젝트를 JAR로 내보낼 때 리소스 파일은 폴더 안에 배치되지 않고 "/ templates"가 아닌 "/template.pdf"경로를 사용하여 JAR 최상위 레벨에 배치됩니다. /template.pdf "를 JAR이 실행될 때 class-path를 기준으로 비교합니다. – Houser

+0

프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동하면 빌드 경로에 새 소스 폴더가 생깁니 까? – GoldenJam

+0

예, 템플릿/빌드 경로에 나타납니다. – Houser

0

경로에있는 파일에 jar 파일이있는 경우 프로젝트 -> 빌드 경로에 jar 파일을 추가하고 다음 InputStream is = ClassLoader.getSystemResourceAsStream ("resources/sample.txt ").?

이것은 나를 위해 작동

관련 문제