
IKVM은 멋지구리다.
.NET세상과 Java세상의 접목에 대한 상상을 대부분 처리해 준다.
한 문장으로 '.NET으로 구현한 JVM' 이라고 하지만 실상은 그 보다 기특하더군.
다음 3가지 툴이 핵심이다.
- ikvm : JVM on .NET (dynamic mode)
- ikvmc : *.class / *.jar -> *.DLL or *.EXE(.NET assembly) converter
- ikvmstub : Generate *.JAR(bodyless stub classes) from .DLL(.NET assembly)
간단히 설명하면,
1)은 사용자입장에서는 Sun이외의 다른회사의 JVM이다. 기존에 'java -jar HelloWorld.jar'를 'ikvm -jar HelloWorld.jar'로 바꿔사용 하면 된다. VM이 .NET으로 구현되었다고 하지만 어짜라구? 어찌됬던 runtime에 java bytecode -> .NET CIL 로 변환하기 때문에 좀 느리단다.
2)는 1)보다 재미있다. 일반 .NET application 처럼 .exe 혹은 .dll을 만들어 준다. 즉, 'java -jar HelloWorkd.jar'가 아니라 'HelloWorld.exe'가 된다. first class .NET assembly이기 때문에 1)보다 실행도 빠르다. 다음 간단한 예제를 적용해 보았다.
ikvmc -target:exe -main:net.hanjava.dotnet.HelloProperties bin\net\hanjava\dotnet\HelloProperties.class 하고 실행하면

이런... deployment always sucks!!
가장 심오한 해결책으로 IKVM 디렉토리로 HelloProperties.exe를 옮기고 실행..
-
<br />
-
-- listing properties --<br />
-
java.runtime.name=IKVM.NET<br />
-
sun.boot.library.path=C:\.virtual-ikvm-home\bin<br />
-
java.vm.version=0.40.0.1<br />
-
java.vm.vendor=Jeroen Frijters<br />
-
java.vendor.url=http://ikvm.net/<br />
-
path.separator=;<br />
-
java.vm.name=IKVM.NET<br />
-
file.encoding.pkg=sun.io<br />
-
user.country=KR<br />
-
sun.os.patch.level=<br />
-
java.vm.specification.name=Java Virtual Machine Specification<br />
-
user.dir=C:\IKVM<br />
-
java.runtime.version=0.40.0.1<br />
-
os.arch=x86<br />
-
java.io.tmpdir=C:\Documents and Settings\behumble\Lo...<br />
-
line.separator=</p>
-
<p>java.vm.specification.vendor=Sun Microsystems Inc.<br />
-
user.variant=<br />
-
os.name=Windows XP<br />
-
gnu.classpath.version=0.95<br />
-
java.library.path=C:\IKVM;.;C:\WINDOWS\Sun\Java\bin;C:\...<br />
-
java.specification.name=Java Platform API Specification<br />
-
java.class.version=50.0<br />
-
os.version=5.1<br />
-
user.home=C:\Documents and Settings\behumble<br />
-
user.timezone=<br />
-
gnu.javax.swing.noGraphics2D=true<br />
-
file.encoding=ks_c_5601-1987<br />
-
java.specification.version=1.6<br />
-
user.name=behumble<br />
-
java.class.path=<br />
-
java.vm.specification.version=1.0<br />
-
sun.arch.data.model=32<br />
-
java.home=C:\.virtual-ikvm-home<br />
-
java.specification.vendor=Sun Microsystems Inc.<br />
-
user.language=ko<br />
-
openjdk.version=OpenJDK 6 b12<br />
-
awt.toolkit=ikvm.awt.NetToolkit, IKVM.AWT.WinForm...<br />
-
java.vm.info=compiled mode<br />
-
sun.nio.MaxDirectMemorySize=-1<br />
-
java.version=1.6.0<br />
-
java.ext.dirs=<br />
-
java.vendor=Jeroen Frijters<br />
-
file.separator=\<br />
-
java.vendor.url.bug=http://www.ikvm.net/bugs<br />
-
sun.cpu.endian=little<br />
3) ikvmstub mscorlib.dll 하면 mscorlib.jar를 생성해 준다. 이제 자바 코드로 .NET library를 호출할 수 있다.
당연한 이야기지만 stub만 생성된다. CIL을 해석해서 bytecode로 변경해주는 일 따위는 안한다.

막상 중요한 .NET과 Java의 interop은 상상의 날개를 펼치면 된다.
그런데 이런 짓은 왜 하지?
