Wednesday 11 July 2007

JDK version confilict

** Error Message **

Generated servlet error:
bad class file: C:\Program Files\Java\jre1.5.0_04\lib\rt.jar(java/lang/Object.class)
class file has wrong version 49.0, should be 48.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
public final class write_jsp extends org.apache.jasper.runtime.HttpJspBase


*** Reason ***
Installed JDK 1.4 and JDK 1.5 and it is conflicted.

*** Solution ***
Please clear JDK 1.4 and JDK 1.5
(Remove JDK 1.4 and Reinstall JDK 1.5)

1 open regedit
2 HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment > defined VM
3 delete all key under JavaSoft
4 And reinstall JDK

- Also tomcat has the location for VM...

Also you have to change jre setting. It should be a JDK folder (ex : C:\Program Files\Java\jdk1.5.0_12\jre)
this plugin launches Tomcat using the default JRE checked in Eclipe preferences window. To set a JDK as default JRE for Eclipse open the preference window : Window -> Preferences -> Java -> Installed JREs.
This JRE must be a JDK (This is a Tomcat prerequisite).

** Study **
Q)
자바 프로그램을 만들고 도스 상에서 java 라고 명령을 치는데요.
제가 path 나 classpath 등 환경변수를 모두 삭제하고 해봤거든요.
그런데 다른건 다 안되는데 java 명령은 실행이 되는 겁니다.

그래서 이번엔 program files\java\ ... 안의 jvm.dll 파일을 삭제하고
java 명령을 내려보니까
program files\java\bin\client 안에 jvm.dll 이 없어서 실행이 안된다는
메세지가 나오더라구요.

그래서 아! java 명령은 자바 런타임 환경(Jre) 하고 관련이 있는가
싶거든요. 그런데 java.exe 파일이 path 설정된 것도 아닌데
왜 어떻게 program files 안의 Jre 와 관련이 있는지 이해가 안갑니다.

A)
가장 정확하게 아실려면... src.zip 파일을 열어서 그 안에 launcher 폴더 내의 c 코드를 분석하면 가장 잘 이해할 수 있습니다...

일단 java.exe가 자바 바이너리를 구동하기에는 가장 먼저 jvm.dll이 필요하구요 그리고 해당 몇 가지 추가적인 dll 그리고 API들의 바이너리를 가지고 있는 jar 또는 zip 파일들이 필요합니다...

저두 정확하게 무엇이 필요하며 무엇이 필요없는지 알 수 없습니다... ㅡ.ㅡ;;

일단 java_md.c 파일을 잠깐 분석해보면... jvm.dll을 찾기 위해 그리고 Java_Home을 찾기 위해 Windows일 경우에는 레지스트리를 찾아갑니다... 기본적으로

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment

아래의 CurrentVersion이라는 이름의 값을 봅니다.. 저는 현재 1.4입니다. 그리면 그 아래 키로 1.4가 있는지 찾죠.. 그 키 아래 Java_Home이라는 이름의 값을 봅니다... 있다면 이것이 Java_Home으로 인식합니다.. 저의 경우에는..

C:\Program Files\Java\j2re1.4.2_02

이였습니다...

다음은 .. jvm.dll을 찾습니다.. 먼저 Java_Home 아래의 lib 디렉토리를 찾습니다. 그리고 Windows일 경우 i386이라는 디렉토리 아래에 jvm.cfg를 살펴봅니다... 제경우 그 파일안에 다음과 같이 적혀 있습니다..

-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR

여기서 jvm의 이름 또는 참조 장소를 말하고 있습니다... KNOWN은 아마 존재한다 또는 사용할 수 있다라는 의미인듯하구요... WARN이나 ERROR인 경우는 오류를 내겠다는 의미인듯합니다... 그리고 ALIAED_TO는 별칭된 이름과 동일하다라는 의미입니다...

위 목록중에서 가장 빠른 KNOWN으로 설정된 jvm이 선택됩니다... 여기선 client이죠 그러면 Java_Home 아래 bin 아래 client 디렉토리에 있는 jvm.dll이 jvm으로 로딩되고 그리고 JNI를 사용하여 해당 main class를 로딩하여 main함수를 호출합니다...

앗 그리고 jvm이 로딩되기 이전에 classpath와 여러가지 옵션등이 추가되게 됩니다...