Consulo:IKVM.NETを使用して.NETプラットフォームでJavaコードを実行する

こんにちはHabr。 以前の投稿では、 UnityまたはMono / Microsoft .NETのサポートについてのみ説明しました。 しかし、私が話さないことはもっとたくさんあります。 話したいことが1つあります。これはIKVM.NETです。



私の投稿を見逃した人のために:

ConsuloはIntelliJ IDEA Community Editionのフォークであり、.NETサポート(現時点ではC#であり、このセクターに多くの重点が置かれています)、Java





IKVM.NETで Javaプロジェクトを実行する必要がある状況を想像してください。



IKVM.NETから始めましょう



IKVM.NETは、MonoおよびMicrosoft .NET Framework用のJavaの実装です。 次のコンポーネントが含まれます。



.NETに実装されたJava仮想マシン

Javaクラスライブラリの.NET実装

Javaと.NETの相互運用性を可能にするツール


IKVM.NETの詳細についてはこちらをご覧ください。 チュートリアルをお読みください 。退屈であり、開発者にとってあまり有用ではありません。



Consuloに必要なプラグインを配置しIKVM.NET + Microsoft .NETMono IKVM.NETは機能しません。問題はXamarinにあります )とその依存関係が必要です。 その結果、プラグインのリストは次のようになります。



画像



始めましょう。 Javaプロジェクトを作成し、起動します



画像



printlnとは何かを見てみましょう:



画像



rt.jarにあるPrintStream.classに切り替えました-すべてが通常通りです



IKVM.NETに渡します



今、状況があります-JVMサポートを失いたくありませんが、同時にIKVM.NETでコードを実行できるようにしたいです。 プロジェクトをコピーしたり、 Java設定を失ったりすることは望みません。 私たちは何をしますか?



Visual StudioIntelliJ IDEAなどの他のIDEでは、上記のように行う必要がありますが、 Consuloではありません。 ConsuloにModule Layersと呼ばれる機能があり、 モジュール の設定の複数のレイヤーを作成し、同時にそれらをすばやく切り替えることができます。



標準-各モジュールには、 Defaultという名前の1つのレイヤーがあります。 .NETプロジェクトは、2つの層のデバッグリリースで作成されます



モジュールの設定に入り、 現在のレイヤーのコピーを作成します:



画像



たとえばIKVMと呼びます:



画像



これで2つのレイヤーができました



画像



JavaをサポートするDefaultレイヤーの完全なコピーがありますJavaExtensionsに含まれています)



Javaサポートをオフにして、 IKVM.NETをオンにします。



画像



IKVM .NETには組み込みのJavaコードコンパイラがなく、 javacが使用されるため、 Java SDKを指定する必要があります。



さあ、カスタマイズしてください。 NET拡張モジュール:



画像



Allow Source Rootsを有効にし、 Main Typeを選択する必要があります-IKVM.NETは、 Entry Pointクラスを選択する方法を知りません。 ご覧のとおり、 Javaクラスをすでに選択できます。



また、 mscorlib.dll依存関係を追加する必要があります。



画像



すべてを正しく構成したら、既存の実行構成を実行してみてください。



画像



ただし、これはjava.exeの動作をエミュレートし、起動時にJVMバイトコードをCLIに変換し、スロースタートを保証します。



IKVM.NETは、 Javaコードを* .exeファイルにコンパイルし、通常の.NETアプリケーションとして起動します。 そのため、 IKVM.NETでは、別の実行構成を使用して、 .NETアプリを起動できます。



画像



以下を開始します。



画像



ご覧のとおりikvm.exeではなくuntitled1.exeを既に実行しています。起動速度ははるかに高速です:)。



printlnに切り替えようとしています:



画像



IKVM.OpenJDK.Core.dllにあるPrintStream.msilに切り替えたことがわかります。 つまり、すでに.NETバイコードを使用しており、たとえば.NETクラスを使用できます(すべての.NETクラスには、 Javaクラスと競合しないように初期名前空間cliがあります)。



画像



そして、メソッドを呼び出します:



画像



それでは、 JVMの実装に戻りましょう。



画像



画像



ご覧のとおり、 JVMでは.NETクラスが利用できないため、コードは赤です。



PS



この投稿-柔軟性のあるサポートがどれほど優れているかを示しており、ある種の技術スタックだけに焦点を合わせているわけではありません。 IKVM.NETプラグインは、私にとって優先順位の高いプラグインではないため、あまり知りません。



将来的には、 .NETプラットフォームでのJavaコードのデバッグをご覧ください。 問題があり、それはグローバルです-悲しいかな、それはまだ私のために解決されていません。



ありがとう



All Articles