2014-11-30 2 views
1

Java 응용 프로그램을 -cp 명령 줄 스위치 (폴더 또는 jar 목록 제공)와 함께 실행하고 클래스를 구현하는 것과 기능상의 차이점이 있는지 알고 싶습니다 로더 (예 : URLClassLoader 클래스 사용)를 사용하여 클래스를로드합니다.실행중인 java -cp와 클래스 로더 구현 간의 차이점

예제 코드 :

// -cp approach 
java -jar <myjar.jar> -cp ~/folder/with/jars 

다른 방법 :

// URLClassLoader approach. urls is an array that points to the .jars under ~/folder/with/jars 
URLClassLoader loader = new URLClassLoader(urls); 
loader.findClass(...); 

답변

1

음, 하나, 당신의 예에서와 같이 클래스 로더를 사용하여이 -cp와 달리 소스의 경로를 하드 코딩하는 것을 의미한다.

또한 jvm에서 해결하도록하는 대신 클래스를 직접로드하는 것이 좋습니다. 그럴만 한 이유가 없다면 나에게 불필요한 여분의 코드가 많이 생긴 것처럼 보입니다.

또 다른 차이점은 (그리고 클래스 로더의 장점) 요구에 따라로드 할 수 있다는 것입니다. 내 오픈 JDK 7에서

+0

"하드 코딩 경로"- 프로그램에 대한 명령 줄 인수로 제공된다고 가정합니다. 그런 다음 그들은 하드 코딩되지 않습니다. 기능적으로 차이가 있습니까? (즉, 두 가지 경우 모두에서 동일한 클래스를로드 할 수 있으며 사용 가능한 URL은 같다고 가정합니다.) –

+1

아, 내 부분에 짧은 시력 : P 나는 그렇게 생각하지 않습니다. 클래스가로드 된 후에는 클래스가 동일하게됩니다. – outlyer

1

, 시스템 ClassLoader 차례로 URLClassLoader의 서브 클래스 시스템 프로퍼티 java.class.path의 파일로 생성되는 sun.misc.Launcher$AppClassLoader의 인스턴스입니다. 차이가 (이 AppClassLoaderClassLoader.registerAsParallelCapable()과 "병렬 가능"으로 등록되어 있다는 사실처럼, ClassLoader의 javadoc 참조)가 있지만

당신이 볼 수 있듯이, 내 환경에서 중요한 기능 차이가하지 않는 것 같다.

Java가 이식 가능하기 때문에 JVM의 다른 구현이 비슷한 메커니즘을 사용할 수 있다고 생각합니다. 따라서 중요한 기능적 차이는 없을 것입니다. 어쩌면 기본 권한 정책, 확장 기능 등에서 기능상의 차이는 없을 것입니다.

관련 문제