Consulo: Выполнение Java кода на .NET платформе с помощью IKVM.NET +20
.NET, JAVA
Рекомендация: подборка платных и бесплатных курсов Java - https://katalog-kursov.ru/
Привет Хабр. Мои предыдущие посты описывают только поддержку 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 платформе. Задача
есть, и она глобальная — увы пока не решаема для меня.
Спасибо
К сожалению, не доступен сервер mySQL