2009-08-11 1 views
3

라이브러리로 패키지 된 클래스 파일에 액세스하려고하지만 불행히도 jar 라이브러리는 다른 jar 파일에 패키지되어야합니다.다른 jar 파일에있는 jar 라이브러리 내에있는 클래스 파일을 호출 할 수 있습니까?

예를 들어 일부 클래스 라이브러리가 포함 된 a.jar이 있다고 가정 해 보겠습니다. 내 외부 Java 응용 프로그램에서 jar 파일의 클래스를 호출 (가져 오기) 할 수 있습니다. 이제이 a.jar를 다른 jar b.jar에 넣고 b.jar 외부에서 a.jar의 클래스에 액세스 (가져 오기)해야합니다.

This is not the thing I want to do :)

+0

다른 항아리가 들어있는 항아리를 포장 했는가? 또는 항아리에 종속 항아리를 포함시키고 싶습니까? 문제가 정확히 무엇입니까? – djna

+0

나는 질문을 업데이트했다 : –

답변

6

당신은 처리 할 수 ​​있었다 클래스 로더 작성해야 "항아리에서 항아리를." 이것은 나에게 꽤 나쁜 생각처럼 들린다.

jar 파일을 병합하지 마십시오. 단지 디스크에 별도로 저장하십시오. 더 많은 파일을 필요로한다는 경영진을 설득해야한다고 생각하지만 실제로는 모든 것을 으로 단순화 할 것입니다. 클래스 로더를 작성하는 것이 중요하지 않습니다 ...

+0

+1 "jars within jars"를 나쁜 아이디어라고 부른다. –

1

어쩌면 내가 제대로 이해하지 못 하겠지만, 당신이 원하는 것은 classpath에있는 다른 JAR 파일 (또한)로 프로그램을 실행하는 것입니다.

그렇다면 A.jar에 코어가 있고 B.jar에 라이브러리가 있다고 가정 해 보겠습니다. 이 같은 프로그램을 실행할 수 있습니다 (대체 :와, Windows에서) : 명령 줄 인수에 모두가 어디로 가는지

java -cp A.jar:B.jar main.class.Name args 

main.class.Name는 메인 클래스 이름입니다

args입니다.

당신은이처럼 manifest.mfMain-ClassClass-Path 속성을 넣을 수 있습니다 :

Class-Path: B.jar 
Main-Class: main.class.Name 

그런 다음이 같은 프로그램을 실행할 수 있습니다

java -jar A.jar args 

당신에게 진실을 말하자면, 내가 사용 내 응용 프로그램을 단일 JAR 파일로 배포하고 모든 종속성을 추출하여 하나의 거대한 JAR 파일로 래핑하는 것은 매끄러운 일이라고 생각하는 것입니다. 문제는 일부 응용 프로그램이 상당수의 종속성을 갖게되고 코드를 변경할 때마다 종속성에 변경된 사항이 없더라도 모든 종속 코드를 배포해야한다는 의미이기도합니다. 이것은 사소한 변화가있을지라도 거대한 JAR 파일을 배포하는 것을 의미했습니다.

manifest 속성을 사용하면 단일 JAR 파일 (일부 시스템에서는 두 번 클릭하거나 간단한 "java -jar"주문)과 똑같은 방식으로 실행될 수있는 응용 프로그램을 배포 할 수 있지만 톤 이후의 소프트웨어 릴리스에서 모든 중복 라이브러리를 전송하지 않아도 시간과 대역폭을 절약 할 수 있습니다.

종속적 인 JAR을 자신의 디렉토리에 넣을 수도 있습니다 (지금은 lib이라고 부름). Class-Path을 수정하여 모든 JAR 경로가 "lib/B.jar"처럼 보이도록하십시오. 그렇다면 많은 작은 JAR 파일들로 가득 찬 주 프로그램 디렉토리로 끝나지 않을 것입니다.

+0

문제는 OP에 다른 jar 파일 안에 하나의 jar 파일 *이 있다는 것입니다. –

+0

나는 그 질문의 제목을 다시 읽음으로써 더 명확해질 것이라고 생각하지만, 질문 문구 그 자체가 아니다. –

+0

나는 질문을 업데이트한다. :) –