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) и их зависимости. В итоге наш список плагинов выглядит так:

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

    Спасибо
    • +20
    • 11.3k
    • 8
    Share post

    Similar posts

    Comments 8

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

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

      Извините, но аргументы «опечатки в личку» не принимаются — это уже какой-то армагеддец.
      В профиле вроде Россия указана.
        +2
        Я, конечно, тоже за грамотность, но, если честно, меня сильно удивило, что у статьи про довольно интересную и сложную вещь всего один комментарий, и тот — про орфографию… Вы бы по делу прокомментировали.
          +2
          Спасибо, мне самим нравится эта вещь. До консулы не существовало нативной поддержки IKVM, так как — никто не делал IDE для Java и .NET.

          Поддержка выглядин доволи интересно (как по мне)
        +2
        Спасибо — можно было и ЛК. Да — текущее месторасположения Россия, но я не русский
          0
          Возможно ли использование Consulo с коммандной строки для запуска java приложение под .NET?
            0
            Консула это ток обертка по сути, IKVM.NET разрешает запуск через CommandLine.
          • UFO just landed and posted this here
              0
              Увы, бывает все

            Only users with full accounts can post comments. Log in, please.