Consulo: Выполнение Java кода на .NET платформе с помощью IKVM.NET +20


Привет Хабр. Мои предыдущие посты описывают только поддержку Unity или Mono/Microsoft .NET. Но при есть ещё много вещей про которые я не рассказываю. Вот про одну я хочу рассказать, это IKVM.NET

Для тех кто пропустил мои посты:
Consulo — это форк IntelliJ IDEA Community Edition, который имеет поддержку .NET(C# на текущий момент, и на этот сектор пока идет большой акцент), Java


Представим ситуацию, что нам нужно запустить Java проект под IKVM.NET.

Начнем сначала с IKVM.NET

IKVM.NET is an implementation of Java for Mono and the Microsoft .NET Framework. It includes the following components:

A Java Virtual Machine implemented in .NET
A .NET implementation of the Java class libraries
Tools that enable Java and .NET interoperability

Найти больше про IKVM.NET можно здесь , читаем туториал но он скучный, и не сильно юзабелен для разрабоки.

Ставим нужные плагины для Consulo, нам нужны IKVM.NET + Microsoft .NET(Mono IKVM.NET не работает, проблема со стороны Xamarin) и их зависимости. В итоге наш список плагинов выглядит так:

image.

Приступим. Создаем Java проект, и запускаем

image

Давайте посмотрим, что такое println:

image

Мы перешли на PrintStream.class который находится в rt.jar — все как обычно

Переходим на IKVM.NET


Теперь у нас ситуация — я не хочу терять поддержку JVM, но при этом я хочу иметь возможность запустить код под IKVM.NET. Копировать проект, или терять Java настройки, желания я не имею. Что нам делать?

Под другими IDE — таких как Visual Studio или IntelliJ IDEA, пришлось бы делать как выше описано — но не в Consulo. Consulo имеет функционал называем Module Layers, он позволяет создавать несколько слоев настроек для модулей, и при этом быстро переключатся между ними.

Стандартно — каждый модуль имеет один слой который имеет названия Default. .NET проекты создаются с двумя слоями Debug & Release

Заходим в настройки модуля, и делаем копию текущего слоя:

image

Называем его, например, IKVM:

image

Теперь мы имеем два слоя:

image

Мы имеем полную копию Default слоя, с поддержкой JavaExtensions включена Java)

Выключаем Java поддержки, и включаем IKVM.NET:

image

Java SDK нужно указывать, так как IKVM .NET не имеет встроенного компилятора Java кода, и используется javac.

Идем выше, настраиваем.NET расширения модуля:

image

Нам нужно включить Allow Source Roots, и выбрать Main TypeIKVM.NET не умеет выбирать Entry Point класс. Как видим, мы уже можем выбрать Java класс.

Также нам нужно, добавить в зависимости mscorlib.dll:

image

Если мы все правильно настроили, пробуем запустить уже существующий Run Configuration:

image

Но это эмулирует поведения java.exe, и во время запуска транслирует JVM байткод в CLI, что гарантирует медленный запуск.

IKVM.NET предлагает компиляцию Java кода в *.exe файл, который потом запускается как обычное .NET приложения. Поэтому под IKVM.NET нам доступная другая Run Configuration, которая запускает .NET App:

image

Запускаем:

image

Как видим, мы уже запускаем untitled1.exe а не ikvm.exe, скорость запуска намного выше :).

Пробуем перейти теперь на println:

image

Теперь мы видим что перешли в PrintStream.msil, который лежит в IKVM.OpenJDK.Core.dll. То есть мы работает уже с .NET байкодом, и можем например использовать .NET классы (все .NET классы имеет начальный namespace cli, что бы не конфликтовать с Java классами):

image

И вызывать методы:

image

Теперь давайте вернемся на JVM реализацию:

image

image

Как видим — код красный, так как на JVM, .NET классы недоступные.

PS


Этот пост — показывает насколько гибкая поддержка, и не сосредоточена только на каком-то стеке технологий. IKVM.NET плагин много чего не умеет, ибо это не приоритетный плагин для меня.

В будущем хотелось бы увидеть Debug для Java кода на .NET платформе. Задача есть, и она глобальная — увы пока не решаема для меня.

Спасибо




К сожалению, не доступен сервер mySQL