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 或 JDK 目录结构,包含所有标准工具:javac、jdeps、policytool、keytool 等。某些 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 样式的项目可以直接在命令行上构建,也可以使用支持它们的 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 库的合适位置。
我们不能强迫您遵守此建议。但为了生态系统的健康,我们敦促您自己考虑一下。