2009-05-24 2 views
2

나는 웹 응용 프로그램과 두 개의 클래스 파일,웹 응용 프로그램을 시작할 때 가장 먼저로드 할 클래스는 무엇입니까?

첫 번째 클래스는 abc.jar 파일 내부 (WEB-INF/lib 디렉토리/abc.jar) 및 두 번째 클래스입니다 MyClass.classYourClass이다가 클래스 폴더 (WEB-INF/classes/YourClass.class) 안에있는 클래스.

제 질문은 응용 프로그램이 시작될 때 어떤 클래스가 먼저로드 될까요? 그리고 왜 ?

답변

9

제 경험상 JVM에서 클래스를로드하는 순서를 예측할 수 없습니다.

일단 테스트 러너 (다소 Maven 's Surefire)를 만들고 동일한 JVM 및 OS를 사용하면 다른 시스템에서 실행될 때 클래스가 다른 순서로로드됩니다. 배운 교훈 :

당신은 응용 프로그램 을 구축하지 않아야 클래스 로딩 순서

+3

+1 - 잘 쓰여진 우수한 점. – duffymo

3

Sun의 class loader docs은 항상 WEB-INF/classes 또는 WEB-INF/lib라고 말하지만 어느 것이 먼저 검사되는지는 설명하지 않습니다. IBM docs에서

:

"클래스를로드하기위한 규칙이 JVM 사양의 세부 사항에서 철자가 기본 원칙은가 (또는 적어도로드 것으로 보인다 필요할 때 클래스 만로드되는 것입니다. 이 방법 - JVM은 실제 로딩에 약간의 유연성이 있지만 클래스 초기화의 고정 된 순서를 유지해야합니다.)로드되는 각 클래스는 의존하는 다른 클래스를 가질 수 있으므로 로딩 프로세스는 재귀 적입니다. "

그래서 대답은 다음과 같습니다. 우선 응용 프로그램에서 어떤 클래스가 필요한지에 따라 다릅니다.

1

duffymo가 지적 하듯이,이 달라질 수 있습니다에 의존합니다. 이 특정 앱의 순서를 확인할 수있는 한 가지 방법은 Response.Write 텍스트를 클래스 생성자 및 웹 웹 앱 페이지로드 메소드에 삽입하는 것입니다. "클래스 A의 인스턴스화 된 객체", "열린 웹 페이지 MyPage"등.

시퀀스를 파악한 후에는 시퀀스에 영향을주는 변경 사항 (예 : 개체를 더 일찍 또는 나중에 인스턴스화하는 등)을 적용하지 않았 음을 나중에 다시 확인할 수 있도록 코드를 주석 처리하십시오.

5

"필요하다"의 정의에 따라 필요에 따라 클래스가로드됩니다. 클래스가로드 될 때 정확히 JRE 구현, javac 구현, 정확히 어떤 스레드까지, 서버 코드 및 응용 프로그램 코드에 의존합니다. 이 영역에서 가정을하는 것은 나쁜 생각입니다. 특정 실행에 대해 어떤 일이 발생하는지 알고 싶다면 -verbose:class