Привет Хабр. Мои предыдущие посты описывают только поддержку 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 платформе. Задача есть, и она глобальная — увы пока не решаема для меня.

Спасибо

Комментарии (8)


  1. dbanet
    02.08.2015 17:27
    -6

    Consulo: Выполнения Java кода на .NET платформе с помощь IKVM.NET
    Привет хабр.

    Заголовок и первое предложение-приветствие, и уже три ошибки (не считая того, что либо «кода Java», либо «Java-кода». То же и про .NET).

    Извините, но аргументы «опечатки в личку» не принимаются — это уже какой-то армагеддец.
    В профиле вроде Россия указана.


    1. mike114
      02.08.2015 21:46
      +2

      Я, конечно, тоже за грамотность, но, если честно, меня сильно удивило, что у статьи про довольно интересную и сложную вещь всего один комментарий, и тот — про орфографию… Вы бы по делу прокомментировали.


      1. VISTALL
        02.08.2015 22:37
        +2

        Спасибо, мне самим нравится эта вещь. До консулы не существовало нативной поддержки IKVM, так как — никто не делал IDE для Java и .NET.

        Поддержка выглядин доволи интересно (как по мне)


  1. VISTALL
    02.08.2015 17:29
    +2

    Спасибо — можно было и ЛК. Да — текущее месторасположения Россия, но я не русский


  1. Ntropy
    03.08.2015 19:06

    Возможно ли использование Consulo с коммандной строки для запуска java приложение под .NET?


    1. VISTALL
      03.08.2015 19:14

      Консула это ток обертка по сути, IKVM.NET разрешает запуск через CommandLine.


  1. guai
    04.08.2015 18:44

    Мне вот интересно, а где используется IKVM.NET?
    Оно ж наверняка бажнее явы и дотнета по отдельности.
    А то давайте туда еще jruby запихаем, и будем запускать из-под вайна в виртуалке, чтобы совсем весело дебажить было.


    1. VISTALL
      05.08.2015 16:49

      Увы, бывает все