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 運行時映像皆可使用。這些映像是標準 JRE 或IKVM.Image.JRE
目錄結構,包含所有標準工具IKVM.Image.JDK
javac、jdeps、policytool、keytool 等。包應該添加到您的項目中。
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 樣式的專案可以直接在命令列上構建,也可以使用支援它們的 IDE(例如最新版本的 Visual Studio 或 JetBrains Rider)來建構。
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 項目的標識。該值可以是以下之一:
|
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 或無法計算 AssemblyName,請使用此值。 |
FallbackAssemblyVersion | 如果未提供AssemblyVersion 或無法計算 AssemblyVersion,請使用此值。 |
KeyFile | 指定包含加密金鑰的檔案名稱。使用此選項時,編譯器會將指定檔案中的公鑰插入程式集清單中,然後使用私鑰對最終組件進行簽署。 |
DelaySign | 此選項可讓編譯器在輸出檔中保留空間,以便稍後新增數位簽章。如果您只想將公鑰放入程式集中,請使用DelaySign 。除非與KeyFile 一起使用,否則DelaySign 選項無效。 |
Compile | 要編譯到程式集中的 Java 類別路徑項的分號分隔清單。預設情況下,如果項目的標識是現有的 JAR 檔案或目錄(尚不支援),則該值是項目的Identity 。支援 MSBuild glob 來引用多個 JAR 或 .class 檔案。 |
Sources | 在文件產生過程中使用的以分號分隔的 Java 原始檔清單。 (尚不支持) |
References | 可選的以分號分隔的其他IkvmReference 識別值列表,指定為對目前 IkvmReference 識別值的參考。例如,如果foo.jar 依賴bar.jar ,則將兩者都包含為IkvmReference 項,但在foo.jar 的References 資料上指定bar.jar 的識別。 |
Debug | 指示如何產生偵錯符號的可選值。預設情況下,這是根據項目的<DebugType> 屬性來決定的。目前僅支援完整的調試符號。 |
Aliases | 以分號分隔的別名列表,可用來引用References 中的組件。 |
ClassLoader | 用作委託父級的自訂 ClassLoader 實作的完全限定類別名稱。範例包括ikvm.runtime.AppDomainAssemblyClassLoader 和ikvm.runtime.ClassPathAssemblyClassLoader 。 |
Reference MSBuild 項組定義支援的所有其他元資料。 |
IkvmReference
不可傳遞。將其包含在一個項目中並從第二個項目添加對該項目的依賴項不會導致第二個項目上出現相同的引用。相反,添加對每個項目的引用。
對於解析為相同結果組件的每個項目,請確保它們的設定相同。
可以將多個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 自述文件。
IKVM 專案建議人們不要在 NuGet.org 等公共系統上重新分發使用 IKVM 編譯的 FOSS Java 程式庫,除非您是該軟體的原始所有者並且有令人信服的理由。
建立 FOSS Java 函式庫的副本並將其發佈到 NuGet.org 等分發機制會造成生態系統混亂和下游依賴衝突。我們提供了一個系統,以便 Java 函式庫的 .NET 使用者可以透過 IKVM.Maven 直接從標準 Java 生態系統機制(Maven Central 等)引用這些函式庫。請記住,很少有圖書館是憑空存在的。庫通常依賴數十個其他庫。兩個不相關的 Java 函式庫通常依賴同一個底層 Java 函式庫。解決任何單一下游項目的這種層次結構都必須涉及依賴衝突解決和版本統一的複雜方法。您可能會向您版本的使用者引入重複的類,或導致您的使用者依賴其他庫的錯誤版本。
除此之外,我們目前不保證靜態編譯組件與 IKVM.Java 和 IKVM.Runtime 函式庫之間的 API 保持穩定。針對某一版本的 IKVM 所建構的靜態編譯組件不能保證在較高版本的 IKVM 上執行,即使在修補程式層級也是如此。我們希望在未來宣傳對此提供更好的支持,但目前我們不想抑制 IKVM.Runtime 和 IKVM.Java API 的大量工作計劃。由於我們也提供建置工具來簡化從建置機器重新編譯程序集的過程,因此如果遵循建議,那麼影響應該是有限的。
此建議也有例外,例如庫未發佈到 Maven。在這種情況下,指導意見是提倡將原始 Java 庫發佈到 Maven,或者自己完成這項工作,因為那是 Java 庫的合適位置。
我們不能強迫您遵守此建議。但為了生態系統的健康,我們敦促您自己考慮一下。