Consulo: Выполнения Java кода на .NET платформе с помощь IKVM.NET
Привет хабр. Мои предыдущие посты описывают только поддержку 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) и их зависимости. В итоге наш список плагинов выглядит так:
.
Приступим. Создаем Java проект, и запускаем
Давайте посмотрим, что такое println:
Мы перешли на PrintStream.class который находится в rt.jar — все как обычно
Переходим на IKVM.NET
Теперь у нас ситуация — я не хочу терять поддержку JVM, но при этом я хочу иметь возможность запустить код под IKVM.NET. Копировать проект, или терять Java настройки, желания я не имею. Что нам делать?
Под другими IDE — таких как Visual Studio или IntelliJ IDEA, пришлось бы делать как выше описано —, но не в Consulo. Consulo имеет функционал называем Module Layers, он позволяет создавать несколько слоев настроек для модулей, и при этом быстро переключатся между ними.
Стандартно — каждый модуль имеет один слой который имеет названия Default. .NET проекты создаются с двумя слоями Debug & Release
Заходим в настройки модуля, и делаем копию текущего слоя:
Называем его, например, IKVM:
Теперь мы имеем два слоя:
Мы имеем полную копию Default слоя, с поддержкой Java(в Extensions включена Java)
Выключаем Java поддержки, и включаем IKVM.NET:
Java SDK нужно указывать, так как IKVM .NET не имеет встроенного компилятора Java кода, и используется javac.
Идем выше, настраиваем.NET расширения модуля:
Нам нужно включить Allow Source Roots, и выбрать Main Type — IKVM.NET не умеет выбирать Entry Point класс. Как видим, мы уже можем выбрать Java класс.
Так же нам нужно, добавить в зависимости mscorlib.dll:
Если мы все правильно настроили, пробуем запустить уже существующий Run Configuration:
Но это эмулирует поведения java.exe, и во время запуска транслирует JVM байткод в CLI, что гарантирует медленный запуск.
IKVM.NET предлагает компиляцию Java кода в *.exe файл, который потом запускается как обычное .NET приложения. Поэтому под IKVM.NET нам доступная другая Run Configuration, которая запускает .NET App:
Запускаем:
Как видим, мы уже запускаем untitled1.exe, а не ikvm.exe, скорость запуска намного выше:).
Пробуем перейти теперь на println:
Теперь мы видим что перешли в PrintStream.msil, который лежит в IKVM.OpenJDK.Core.dll. Тоисть мы работает уже с .NET байкодом, и можем например использовать .NET классы (все .NET классы имеет начальный namespace cli, что бы не конфликтовать с Java классами):
И вызывать методы:
Теперь давайте вернемся на JVM реализацию:
Как видим — код красный, так как на JVM, .NET классы недоступные.
PS
Этот пост — показывает насколько гибкая поддержка, и не сосредоточена только на каком-то стеке технологий. IKVM.NET плагин много чего не умеет, ибо это не приоритетный плагин для меня.
В будущем хотелось бы увидеть Debug для Java кода на .NET платформе. Задача есть, и она глобальная — увы пока не решаема для меня.
Спасибо