IKVM は、Microsoft .NET プラットフォーム用の Java 実装です。これを使用すると、次のことが迅速かつ簡単に行えます。
これらのタスクは、ソース コードを .NET に移植しなくても実行できます。
<MavenReference>
、 <IkvmReference>
またはikvmc
使用して Java アプリケーションを .NET アセンブリにコンパイルします。ikvmc
使用してビルドするときに、実行時に実行するmain()
メソッドを含むクラスを指定することで起動できます。java
実行可能ファイルを使用して Java アプリケーションを実行します。 Java バイトコードはオンザフライで CIL に変換され、実行されます。エクスペリエンスは通常の JDK と同じであるはずです。 すべてのさまざまなアーティファクトのサポートにはさまざまな違いが存在します。たとえば、イメージを配布できないプラットフォームやツールを配布できないプラットフォームがあります。
PM> Install-Package IKVM
または、 MavenReference
使用するには:
PM> Install-Package IKVM.Maven.Sdk
ツールはリリース ページからダウンロードできます。
JRE と JDK の両方のランタイム イメージが利用可能です。これらのイメージは、javac、jdeps、policytool、keytool などのすべての標準ツールを含む標準の JRE または JDK ディレクトリ構造です。一部の Java ライブラリでは、JRE または JDK が必要になる場合があり、必要な場合はIKVM.Image.JRE
またはIKVM.Image.JDK
パッケージをプロジェクトに追加する必要があります。
PM> Install-Package IKVM.Image.JRE
PM> Install-Package IKVM.Image.JDK
スタンドアロンの JDK 配布可能ファイルは、リリース ページからダウンロードできます。このディレクトリ構造は、標準 Java アプリケーションのJAVA_HOME
パスとして十分です。
IKVM は、.NET SDK スタイルのプロジェクトとの統合をサポートするだけでなく、コンパイルされた Java コードを直接実行するための、または高度なビルド シナリオのための低レベル ツールもサポートします。 .NET SDK スタイルのプロジェクトと統合するための 2 つの主要なエントリ ポイントはIkvmReference
とMavenReference
です。 .NET SDK スタイルのプロジェクトは、コマンド ラインで直接構築することも、最新バージョンの Visual Studio や JetBrains Rider などのプロジェクトをサポートする IDE を使用して構築することもできます。
IKVM には、Java ライブラリを .NET アセンブリに変換するためのビルド時のサポートが含まれています。 Java ライブラリへの参照を必要とするプロジェクトにIKVM
パッケージをインストールします。 ItemGroup
内でIkvmReference
を使用して、プロジェクトに必要な Java ライブラリを指定します。
< ItemGroup >
< PackageReference Include = " IKVM " Version = " Version " />
</ ItemGroup >
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " />
</ ItemGroup >
出力アセンブリはプロジェクトのビルド プロセスの一部として生成され、参照がプロジェクトに自動的に追加されるため、コンパイルされた.jar
アセンブリの API を呼び出すことができます。追加のメタデータをIkvmReference
に追加して、生成されるアセンブリをカスタマイズできます。
< ItemGroup >
< IkvmReference Include = " ....exthelloworldhelloworld-2.0.jar " >
< AssemblyName >MyAssembly</ AssemblyName >
< AssemblyVersion >3.2.1.0</ AssemblyVersion >
< AssemblyFileVersion >3.0.0.0</ AssemblyFileVersion >
< DisableAutoAssemblyName >true</ DisableAutoAssemblyName >
< DisableAutoAssemblyVersion >true</ DisableAutoAssemblyVersion >
< FallbackAssemblyName >MyAssemblyFallback</ FallbackAssemblyName >
< FallbackAssemblyVersion >3.1.0.0</ FallbackAssemblyVersion >
< KeyFile >MyKey.snk</ KeyFile >
< DelaySign >true</ DelaySign >
< Compile >SomeInternalDependency.jar;SomeOtherInternalDependency.jar</ Compile >
< Sources >MyClass.java;YourClass.java</ Sources >
< References >SomeExternalDependency.jar;SomeOtherExternalDependency.jar</ References >
< Aliases >MyAssemblyAlias;helloworld2_0</ Aliases >
< Debug >portable</ Debug >
</ IkvmReference >
</ ItemGroup >
次の値は、 <IkvmReference>
の属性またはネストされた要素として使用できます。
属性または要素 | 説明 |
---|---|
Include (属性のみ) | IkvmReference 項目の ID。値は次のいずれかになります。
|
AssemblyName | デフォルトでは、 AssemblyName 、 Automatic-Module-Name 仕様で定義されたルールを使用して生成されます。これをオーバーライドするには、ここでオーバーライドします。値にはファイル拡張子を含めることはできません.dll が自動的に追加されます。 |
AssemblyVersion | デフォルトでは、 AssemblyVersion 、 Automatic-Module-Name 仕様で定義されたルールを使用して生成されます。これをオーバーライドするには、ここでオーバーライドします。 |
AssemblyFileVersion | デフォルトでは、 AssemblyFileVersion は、 Automatic-Module-Name 仕様で定義されたルールを使用して生成されるか、オーバーライドされる場合はAssemblyVersion と同じ値を使用して生成されます。これをオーバーライドするには、ここでオーバーライドします。 |
DisableAutoAssemblyName | true の場合、 AssemblyName の検出が無効になります。 |
DisableAutoAssemblyVersion | true の場合、 AssemblyVersion の検出が無効になります。 |
FallbackAssemblyName | AssemblyName が指定されていないか計算できない場合は、この値を使用します。 |
FallbackAssemblyVersion | AssemblyVersion が提供されない場合、または計算できない場合は、この値を使用します。 |
KeyFile | 暗号キーを含むファイル名を指定します。このオプションを使用すると、コンパイラは指定されたファイルの公開キーをアセンブリ マニフェストに挿入し、秘密キーを使用して最終アセンブリに署名します。 |
DelaySign | このオプションを指定すると、後でデジタル署名を追加できるように、コンパイラーが出力ファイルにスペースを予約します。アセンブリに公開キーを配置するだけの場合は、 DelaySign を使用します。 DelaySign オプションは、 KeyFile と一緒に使用しない限り、効果がありません。 |
Compile | アセンブリにコンパイルする Java クラスパス項目のセミコロンで区切られたリスト。項目の ID が既存の JAR ファイルまたはディレクトリ (まだサポートされていない) である場合、デフォルトでは、この値は項目のIdentity です。 MSBuild グロブは、複数の JAR または .class ファイルの参照をサポートしています。 |
Sources | ドキュメント生成時に使用する Java ソース ファイルのセミコロンで区切られたリスト。 (まだサポートされていません) |
References | 現在の IkvmReference ID 値への参照として指定する、オプションのセミコロンで区切られた他のIkvmReference ID 値のリスト。たとえば、 foo.jar bar.jar に依存する場合、両方をIkvmReference 項目として含めますが、 foo.jar のReferences メタデータでbar.jar の ID を指定します。 |
Debug | デバッグ シンボルの生成方法を示すオプションの値。デフォルトでは、これはプロジェクトの<DebugType> プロパティに基づいて決定されます。現在、完全なデバッグ シンボルのみがサポートされています。 |
Aliases | References でアセンブリを参照するために使用できるエイリアスのセミコロンで区切られたリスト。 |
ClassLoader | 委任の親として使用するカスタム ClassLoader 実装の完全修飾クラス名。例には、 ikvm.runtime.AppDomainAssemblyClassLoader およびikvm.runtime.ClassPathAssemblyClassLoader が含まれます。 |
Reference MSBuild 項目グループ定義でサポートされている他のすべてのメタデータ。 |
IkvmReference
は推移的ではありません。これを 1 つのプロジェクトに含めて、2 番目のプロジェクトからそのプロジェクトに依存関係を追加しても、同じ参照が 2 番目のプロジェクトで使用可能になることはありません。代わりに、各プロジェクトに参照を追加します。
各プロジェクトが同じ結果のアセンブリに解決されるように、それらの設定が同一であることを確認してください。
複数のIkvmReference
エントリは、相互に参照として含めるように構成できます。
< ItemGroup >
< IkvmReference Include = " helloworld.jar " >
< AssemblyVersion >1.0.0.0</ AssemblyVersion >
</ IkvmReference >
< IkvmReference Include = " helloworld-2.jar " >
< AssemblyName >helloworld-2</ AssemblyName >
< AssemblyVersion >2.0.0.0</ AssemblyVersion >
< References >helloworld.jar</ References >
< Aliases >helloworld2</ Aliases >
</ IkvmReference >
</ ItemGroup >
Automatic-Module-Name
指定Automatic-Module-Name
は、JAR マニフェストの指定された属性 (JAR 内のMETA-INF/MANIFEST.MF
ファイルにあります)、または JAR ファイルの名前に基づいて生成された値のいずれかです。詳細については、ドキュメントを参照してください。
使用方法については、ikvm-maven Readme を参照してください。
IKVM プロジェクトは、ソフトウェアの元の所有者であり、やむを得ない理由がある場合を除き、IKVM でコンパイルされた FOSS Java ライブラリを NuGet.org などのパブリック システムで再配布しないことを推奨しています。
FOSS Java ライブラリのコピーを作成し、NuGet.org などの配布メカニズムに公開すると、下流でエコシステムの混乱と依存関係の競合が発生します。 Java ライブラリの .NET ユーザーが、IKVM.Maven を介して、標準 Java エコシステム メカニズム (Maven Central など) からこれらのライブラリを直接参照できるシステムを提供します。孤立して存在するライブラリはほとんどないことを覚えておいてください。ライブラリは多くの場合、他の数十のライブラリに依存します。 2 つの無関係な Java ライブラリは、多くの場合、同じ基礎となる Java ライブラリに依存します。個々の下流プロジェクトのこの階層を解決するには、依存関係の競合解決とバージョン統合の複雑な方法を使用する必要があります。おそらく、あなたのバージョンのユーザーに重複したクラスを導入することになるか、ユーザーが他のライブラリの間違ったバージョンに依存することになるでしょう。
上記に加えて、現時点では、静的にコンパイルされたアセンブリと IKVM.Java および IKVM.Runtime ライブラリ間の API が安定していることは保証されていません。あるバージョンの IKVM に対してビルドされた静的にコンパイルされたアセンブリは、パッチ レベルであっても、より上位のバージョンの IKVM に対して実行されることは保証されません。将来的には、これに対するサポートの改善を宣伝したいと考えていますが、現時点では、IKVM.Runtime および IKVM.Java API に関して多くの作業が計画されており、それらを抑制したくありません。ビルド マシンからアセンブリを再コンパイルするプロセスを容易にするビルド ツールも提供しているため、推奨事項に従えば影響は限定的です。
このアドバイスには、ライブラリが Maven に公開されないなどの例外があります。その場合、オリジナルの Java ライブラリを実際に Maven に公開するか、そこが Java ライブラリにとって適切な場所であるため、自分で作業を行うことを推奨することになります。
このアドバイスに従うことを強制することはできません。ただし、生態系の健全性を考慮して、ご自身で考慮することをお勧めします。