![](https://habrastorage.org/getpro/habr/post_images/8e1/d46/49f/8e1d4649f46357db1109b99d830fd90a.png)
Для тех кто пропустил мои посты:
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](https://habrastorage.org/getpro/habr/post_images/5f4/53f/4ff/5f453f4ff6ac799bb8c23dcc78de1cfe.png)
Приступим. Создаем Java проект, и запускаем
![image](https://habrastorage.org/getpro/habr/post_images/734/e0a/a88/734e0aa8871e899557cd328b2e81efe0.png)
Давайте посмотрим, что такое println:
![image](https://habrastorage.org/getpro/habr/post_images/895/408/7e2/8954087e26d5fc7c2324ae5e85611024.png)
Мы перешли на PrintStream.class который находится в rt.jar — все как обычно
Переходим на IKVM.NET
Теперь у нас ситуация — я не хочу терять поддержку JVM, но при этом я хочу иметь возможность запустить код под IKVM.NET. Копировать проект, или терять Java настройки, желания я не имею. Что нам делать?
Под другими IDE — таких как Visual Studio или IntelliJ IDEA, пришлось бы делать как выше описано — но не в Consulo. Consulo имеет функционал называем Module Layers, он позволяет создавать несколько слоев настроек для модулей, и при этом быстро переключатся между ними.
Стандартно — каждый модуль имеет один слой который имеет названия Default. .NET проекты создаются с двумя слоями Debug & Release
Заходим в настройки модуля, и делаем копию текущего слоя:
![image](https://habrastorage.org/getpro/habr/post_images/4ee/e2b/384/4eee2b384ea87ffb2a7b9ca29e8bc32a.png)
Называем его, например, IKVM:
![image](https://habrastorage.org/getpro/habr/post_images/210/f2f/0e4/210f2f0e42b194f0d977853e921d7c2c.png)
Теперь мы имеем два слоя:
![image](https://habrastorage.org/getpro/habr/post_images/0c4/1e9/5b5/0c41e95b5415cb4c43be749bfe958801.png)
Мы имеем полную копию Default слоя, с поддержкой Java(в Extensions включена Java)
Выключаем Java поддержки, и включаем IKVM.NET:
![image](https://habrastorage.org/getpro/habr/post_images/b0e/f6c/a03/b0ef6ca03c8368d5fa6027a91ae4ea52.png)
Java SDK нужно указывать, так как IKVM .NET не имеет встроенного компилятора Java кода, и используется javac.
Идем выше, настраиваем.NET расширения модуля:
![image](https://habrastorage.org/getpro/habr/post_images/d15/21e/0b3/d1521e0b3b2ea34975824e634fdc6ea5.png)
Нам нужно включить Allow Source Roots, и выбрать Main Type — IKVM.NET не умеет выбирать Entry Point класс. Как видим, мы уже можем выбрать Java класс.
Также нам нужно, добавить в зависимости mscorlib.dll:
![image](https://habrastorage.org/getpro/habr/post_images/5c2/186/ac0/5c2186ac02799350636e609b49237d13.png)
Если мы все правильно настроили, пробуем запустить уже существующий Run Configuration:
![image](https://habrastorage.org/getpro/habr/post_images/38d/d71/28a/38dd7128af2e42c83c0f383b6d734370.png)
Но это эмулирует поведения java.exe, и во время запуска транслирует JVM байткод в CLI, что гарантирует медленный запуск.
IKVM.NET предлагает компиляцию Java кода в *.exe файл, который потом запускается как обычное .NET приложения. Поэтому под IKVM.NET нам доступная другая Run Configuration, которая запускает .NET App:
![image](https://habrastorage.org/getpro/habr/post_images/592/fb4/1cd/592fb41cd888a97e51723fcd3a940da3.png)
Запускаем:
![image](https://habrastorage.org/getpro/habr/post_images/647/d13/92a/647d1392a9d22a52fc6a1f218d97c180.png)
Как видим, мы уже запускаем untitled1.exe а не ikvm.exe, скорость запуска намного выше :).
Пробуем перейти теперь на println:
![image](https://habrastorage.org/getpro/habr/post_images/063/499/ea4/063499ea41e10a3f67ba336048db0224.png)
Теперь мы видим что перешли в PrintStream.msil, который лежит в IKVM.OpenJDK.Core.dll. То есть мы работает уже с .NET байкодом, и можем например использовать .NET классы (все .NET классы имеет начальный namespace cli, что бы не конфликтовать с Java классами):
![image](https://habrastorage.org/getpro/habr/post_images/666/531/478/66653147897c1060b2ab8c7d3aca18a3.png)
И вызывать методы:
![image](https://habrastorage.org/getpro/habr/post_images/6d1/073/abc/6d1073abc6dcc64a22821dfd534320bb.png)
Теперь давайте вернемся на JVM реализацию:
![image](https://habrastorage.org/getpro/habr/post_images/425/d3d/59c/425d3d59c66ca0d900688fbe3c1f352e.png)
![image](https://habrastorage.org/getpro/habr/post_images/83b/b7c/7ff/83bb7c7ff5f63fbaa74dafe36b6dc4f9.png)
Как видим — код красный, так как на JVM, .NET классы недоступные.
PS
Этот пост — показывает насколько гибкая поддержка, и не сосредоточена только на каком-то стеке технологий. IKVM.NET плагин много чего не умеет, ибо это не приоритетный плагин для меня.
В будущем хотелось бы увидеть Debug для Java кода на .NET платформе. Задача есть, и она глобальная — увы пока не решаема для меня.
Спасибо
Комментарии (8)
VISTALL
02.08.2015 17:29+2Спасибо — можно было и ЛК. Да — текущее месторасположения Россия, но я не русский
dbanet
Заголовок и первое предложение-приветствие, и уже три ошибки (не считая того, что либо «кода Java», либо «Java-кода». То же и про .NET).
Извините, но аргументы «опечатки в личку» не принимаются — это уже какой-то армагеддец.
В профиле вроде Россия указана.
mike114
Я, конечно, тоже за грамотность, но, если честно, меня сильно удивило, что у статьи про довольно интересную и сложную вещь всего один комментарий, и тот — про орфографию… Вы бы по делу прокомментировали.
VISTALL
Спасибо, мне самим нравится эта вещь. До консулы не существовало нативной поддержки IKVM, так как — никто не делал IDE для Java и .NET.
Поддержка выглядин доволи интересно (как по мне)