IKVM: .NET 런타임에서 Java 8 코드 실행하기

Mono 프로젝트에서 Java 바이트코드를 직접 실행할 수 있는 수단으로 열심히 개발되다가 어느날 자취를 감추었던 IKVM 프로젝트를 오랫만에 다시 찾아보니, 모던 닷넷 환경에 맞추어 Java 8까지 지원 범위를 넓혀서 다시 활발하게 개발이 진행되고 있어서 소식을 공유합니다.

IKVM은 정적 모드와 동적 모드로 나누어 사용할 수 있습니다.

  • 정적 모드에서는 기존에 가지고 있던 자바 바이트 코드 파일을 MSBUILD 프로젝트에 태그를 추가하는 방식으로 참조를 추가하거나, Maven (닷넷 에코시스템의 Nuget과 대응되는 패키지 매니저입니다.)의 레퍼런스를 추가하기 위해 태그를 추가하는 방식으로 참조를 추가하여 IKVMC로 닷넷 바이트 코드를 생성하는 방식입니다. (요약하면, 자바 바이트 코드를 닷넷 MSIL로 직접 컴파일하는 방식입니다.)
  • 동적 모드에서는 IKVM 프로젝트 전용 Java 8 JVM을 이용해서 Java 코드를 실행하는 방식을 지원합니다. 예전에는 ikvm이라는 실행 파일을 사용했고, 최근에는 java라는 실행 파일을 사용합니다. 실행 파일을 부르는 방식을 넘어서서 런타임에서 깊게 통합할 목적으로 IKVM을 사용하려면, IKVM.Runtime nuget 패키지를 추가한 뒤, 이 메서드를 호출하는 방법을 사용할 수 있습니다.

더 자세한 내용은 프로젝트 리포지터리에서 확인해보실 수 있습니다. 최신 버전인 8.5.2 버전이 2주 전에 출시되었네요! :sunglasses:


그리고 IKVM을 이용하여 소프트웨어를 개발하는 것에 관심이 있으시다면 아래 내용을 숙지해두시면 좋을 것 같아 첨부합니다. (README.md 하단에서 발췌함)

프로젝트 소유자에 대한 공지
IKVM 프로젝트는 사용자가 해당 소프트웨어의 원래 소유자이고 타당한 이유가 있는 경우를 제외하고는 NuGet.org와 같은 공용 시스템을 통해 IKVM으로 컴파일된 FOSS Java 라이브러리를 재배포하지 말 것을 권장합니다.

FOSS Java 라이브러리의 복사본을 생성하여 NuGet.org와 같은 배포 메커니즘에 게시하면 에코시스템에 혼란과 종속성 충돌이 발생할 수 있습니다. 저희는 Java 라이브러리의 .NET 사용자가 표준 Java 에코시스템 메커니즘에서 직접 해당 라이브러리를 참조할 수 있도록 시스템을 제공합니다: Maven Central 등을 통해 참조할 수 있습니다. 진공 상태로 존재하는 라이브러리는 거의 없다는 점을 기억하세요. 라이브러리는 종종 수십 개의 다른 라이브러리에 의존합니다. 서로 관련이 없는 두 개의 Java 라이브러리가 동일한 기본 Java 라이브러리에 종속되는 경우가 많습니다. 개별 다운스트림 프로젝트에서 이러한 계층 구조를 해결하려면 복잡한 종속성 충돌 해결 및 버전 통합 방법을 사용해야 합니다. 버전 사용자에게 중복 클래스를 도입하거나 사용자가 다른 라이브러리의 잘못된 버전에 의존하게 만들 가능성이 높습니다.

위의 사항 외에도 현재 정적으로 컴파일된 어셈블리와 IKVM.Java 및 IKVM.Runtime 라이브러리 간의 API가 안정적으로 유지된다는 것을 보장하지 않습니다. 한 버전의 IKVM에 대해 빌드된 정적으로 컴파일된 어셈블리는 패치 수준에서도 상위 버전의 IKVM에서 실행된다는 보장이 없습니다. 향후 이에 대한 더 나은 지원을 알리고 싶지만, 현재로서는 IKVM.Runtime 및 IKVM.Java API에 대한 많은 작업이 계획되어 있어 이를 방해하고 싶지 않습니다. 또한 빌드 머신에서 어셈블리를 쉽게 다시 컴파일할 수 있는 빌드 도구도 제공하고 있으므로 권장 사항을 준수한다면 영향은 제한적일 것입니다.

라이브러리가 Maven에 게시되지 않은 경우와 같이 이 권장 사항에는 예외가 있습니다. 이 경우, 원본 Java 라이브러리를 실제로 Maven에 게시하거나 직접 작업을 수행하도록 권장하는 것이 지침이 될 것입니다.

이 조언을 따르도록 강요할 수는 없습니다. 하지만 에코시스템의 건강을 위해 스스로 고려하시기 바랍니다.

4개의 좋아요

작년에 한창 관심이 있어서 살펴보던 프로젝트인데,
이제 닷넷코어에서도 제대로 동작하는 모양이군요.

자바 바이트코드를 닷넷 바이트코드로 컴파일해서 닷넷에서 실행한다는 아이디어가 참 대단하더라구요.
자바 라이브러리 뿐만 아니라, 자바 런타임 자체도 닷넷으로 컴파일해서 실행하는 괴물같은 프로젝트인데, 다시 활성화 된듯 싶어 다행입니다.

2개의 좋아요

띄엄띄엄 보기로는, IKVM은 프로젝트가 중단된 적이 있다가, 커뮤니티에서 자원해주신 분이 메인테이너를 새롭게 맡아서 지금까지 이른 것으로 보입니다.

말씀해주신대로 새 주인을 찾아서 최신 닷넷 런타임 지원까지 이르게 된 것은 정말 고무적인 일이라고 생각합니다. :smiley:

2개의 좋아요