2016-10-03 2 views
3

jar manifest를 설정하여 jar 옆에있는 폴더 내의 모든 라이브러리 (jar)를로드하려고합니다. 이 같은폴더의 모든 jar를 사용하기 위해 jar Manifest를 가질 수 있습니까?

매니페스트 외모 :

- MyJar.jar 
- libs/ 
-----lib1.jar 
-----lib2.jar 

내가 이런 식으로 실행하기 위해 노력하고있어 :

Manifest-Version: 1.0 
Class-Path: libs/ 
Main-Class: path.to.my.class.Main 

배치는 다음과 같다

java -jar MyJar.jar 

를 내가 얻을 폴더 내의 항아리에있는 클래스에 대한 NoClassDefinition 오류.

누군가가 궁금한 경우이 폴더에는 클래스를로드하는 동안 처리되는 선택적 jar가 들어있을 수 있습니다. 그 '하드 코드 된 또는 autogenerated 것들을 사용할 수 없습니다 swhy.

아이디어가 있으십니까?

업데이트 현재 매니페스트 자체에서는이 질문을 표현할 수 없으므로 다시 질문하십시오. 그 대답은 항아리 추출의 필요성이 없으면 유일하게 실용적 이었지만 작동합니다.

요약 답은 no입니다. 특정 종속성이있는 경우 매니페스트 파일만으로는 수행 할 수 없습니다.

+0

AFIK JAR의 클래스 경로는'JAR' 파일의 루트에서 시작됩니다. 'Spring Boot' 나'OSGI' 컨테이너처럼 동적으로로드하지 않는 한 클래스 나 JAR을 서브 디렉토리에 넣을 수 없습니다. – 11thdimension

+0

밝혀졌습니다. JAR 이름으로 경로를 지정해야합니다. 이 링크를 확인하십시오. http://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html?_sm_au_=ivVTSRf571T1SvZP – 11thdimension

+0

위의 링크를 먼저 실행했는데 위의 내용은 위의 내용을 기반으로 합니다만, 일하지 마라. 클래스 경로에 정의 된 해당 폴더 내의 파일 만 찾습니다. 폴더만으로 작동하지 않는 것 같습니다. (즉, libs/또는 ./libs/) – javydreamercsw

답변

0

java는 libs 디렉토리의 jar 파일을 알지 못합니다. 당신이 자바 1.6를 사용하는 경우 , 당신은

자바로 프로그램을 실행할 수 있습니다 -cp lib 디렉토리/* -jar MyJar.jar

+0

서면으로 작동하지 않았습니다. java -cp libs/-jar MyJar.jar 이렇게해야했다. 안타깝게도 이것은 내가 매니 페스트에서 가능한지보기 위해 노력하면서 요청한 것이 아닙니다. – javydreamercsw

+0

java -cp libs/* path.to.my.class.Main – javydreamercsw

+0

유일한 유권자 답변으로이 질문을 수정하여 업데이트되었습니다. – javydreamercsw

1

당신은 당신의 매니페스트 클래스 경로를 정의해야

Class-Path: libs/lib1.jar libs/lib2.jar 

참조 Oracle 문서로 자세한 내용은 https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

+0

오직 작동합니다 폴더가 가지고있는 항아리를 미리 아는 경우. 응용 프로그램이 클래스 경로에있을 때이를 감지하는 선택적 jar를위한 것입니다. – javydreamercsw

+0

Class-Path를 시도 했습니까? libs/*. jar? –

+0

시도했지만 여전히 작동하지 않았습니다. – javydreamercsw

1

이러한 병을 추출해보십시오. 디렉토리에서 모든 항아리를 추가 할 수없는 것처럼 보이지만 모든 클래스를 추가 할 수 있습니다. manifest에서 모든 구성을 분명히 잃어 버리지 만 jars의 코드 내용에만 관심이 있다면 작동 할 수도 있습니다.

나는이 간단한 클래스
import pkg.B; 

public class A { 
    public static void main(String[] args) { 
    System.out.println(B.class.getName()); 
    } 
} 

package pkg; 

public class B {} 

와 지금은 클래스를 분리하려고 것을 테스트했다. 나는 그 (것)들을 안으로 끼 우게했다

$ jar tf libA.jar 
META-INF/ 
META-INF/MANIFEST.MF 
A.class 
$ jar tf libB.jar 
META-INF/ 
META-INF/MANIFEST.MF 
pkg/B.class 

아무 명부든지에있는 종류 경로. java -cp libB.jar:libA.jar A으로 A를 실행할 수 있습니다. 지금은 지금은 오른쪽 항아리는

$ java -jar empty.jar 
Error: Could not find or load main class A 

희망없는 시도

$ ls -R 
.: 
A.java empty.jar lib lib.jar manifest pkg 

./lib: 
libA.jar libB.jar 

./pkg: 
B.java 

같이 lib/

$ cat manifest 
Class-Path: lib/ 
$ jar cfm empty.jar manifest 

내 디렉토리 트리로 설정 클래스 경로와 다른 항아리를 만들? 그런 다음 libA.jar과 libB를 추출했습니다.항아리를 lib로 ([this guy] [2]와 동일). 이제는 모두 괜찮습니다.

$ java -jar empty.jar 
pkg.B 
+0

기술적이지 않은 사용자가이 작업을 수행 할 수 없기 때문에이 시나리오에서는 작동하지 않습니다. 항아리를 디렉토리에 넣으라고 요청하는 것만으로는 충분하지 않습니다. 감사 – javydreamercsw