2012-12-17 1 views

답변

2

아마도 "java.class.path"는 classpath 환경 변수 ($ CLASSPATH 또는 -classpath)에서 설정 한 시스템 등록 정보와 관련이 있습니다. -jar 옵션이 사용되면 무시됩니다.

java -jar 설명서에 따라 해당 jar 옵션을 사용하여 응용 프로그램을 실행하면 매니페스트 Class-Path 만 고려되고 다른 설정은 무시됩니다. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html에서 :

-jar

는 JAR 파일에 캡슐화 된 프로그램을 실행합니다. 첫 번째 인수는 시작 클래스 이름 대신 JAR 파일의 이름입니다. 이 옵션을 사용하려면 JAR 파일의 매니페스트에 Main-Class : classname 형식의 행이 있어야합니다. 여기서 classname은 응용 프로그램의 시작점 역할을하는 public static void main (String [] args) 메서드가있는 클래스를 식별합니다. Jar 파일 및 Jar 파일 매니페스트 작업에 대한 정보는 Jar 도구 참조 페이지 및 Java 자습서의 Jar 추적을 참조하십시오.

이 옵션을 사용하면 JAR 파일이 모든 사용자 클래스의 원본이되고 다른 사용자 클래스 경로 설정은 무시됩니다.

0

내가 겪었던 질문에 대한 답변이 정확합니다. java -cp ..;myTest.jar test2.Needer을 사용할 때도 java.class.path 속성에 대한 결과로 "..; myTest.jar"만 표시됩니다.

다음 MANIFEST.MF에 지정된 클래스 경로를 검색하는 -cp 매개 변수를 사용하는 경우에도! (구글 에서이 정보를 찾을 수 없습니다 자신을 테스트)

그래서 나는 그것이 -jar 매개 변수와 관련이 있다고 생각하지 않습니다. Link에서는 와일드 카드의

확장 클래스 로딩 과정 자체 동안, 오히려 후반보다 전에 프로그램의 main 메소드의 호출에 조기 완료 찾을 수 있습니다.

흥미롭게도 테스트 중에 발견 : MANFIFEST.MF의 클래스 경로는 반복적으로 검색됩니다. 그러므로 test.jar 파일이 myTest.jar의 MANIFEST.MF에있는 클래스 경로에 있으면, 012.을 사용할 때 test.jar의 MANIFEST.MF에있는 클래스 경로도 조회됩니다.

결과적으로 java.class.path 속성이 MANIFEST.MF의 클래스 경로 표시를 지원하면 이후에 모든 .jar 파일에 따라 클래스 파문도 표시되어야합니다.classpath는 클래스가 발견 될 때까지만 검색되기 때문에 lazy 로딩 메커니즘을 참조하지 않아야합니다.

TL; DR :이이 -jar 매개 변수와는 아무 상관 (-cp은 물론 우려)이 없다고 생각합니다. 나의 설명에서, MANIFEST.MF로부터 classpath를 보여주기위한 지원은 (실제로 의존성이 없기 때문에 존 재적으로 .jar에서 사용되는 것보다) 부가적이고 무의미한 재귀 탐색 비용을 수반 할 뿐이다. 그리고이 무분별한 검색은 프로그램 시작을 지연시킬 것이므로 (재귀 검색은 실제로 깊을 수 있기 때문에) 구현되지 않습니다.

관련 문제