ikvm

JAVA源码 2025-08-20

ikvm -.NET的Java虚拟机

什么是ikvm ?

ikvm是Microsoft .NET平台的Java实现。它可以用来快速轻松:

  • 执行.NET框架或.NET CORE上的编译Java代码(bytecode)
  • 将字节码转换为.NET组件,以直接在.NET项目中访问其API

这些任务可以执行,而无需将源代码移植到.NET。

ikvm组件

  • .NET中实现的Java虚拟机(JVM)
  • Java类库的.NET实现
  • 将Java字节码(JAR文件)转换为.NET IL(DLL或EXE文件)的工具。
  • 启用Java和.NET互操作性的工具
  • 完整的JRE/JDK 8运行时映像。

使用.NET运行Java应用程序

  1. 静态:通过使用< ikvm Reference>ikvm c将Java应用程序编译为.NET组件。
    • 可以通过任何.NET应用程序引用库组件,该应用程序具有兼容目标框架和平台。可以通过使用Java软件包名称(例如.NET名称空间)来引用类型。
    • 可以通过指定包含main()方法在运行时执行时使用ikvm c在运行时执行的类的类来启动可执行组件。
  2. 动态:通过使用JDK运行时映像内部的java可执行文件运行Java应用程序。 Java字节码在即时转换为CIL并执行。经验应与普通JDK相同。

ikvm不是

  • 转换器实用程序以将Java源代码转换为C#源代码
  • 将编译的Java字节码转换为c#源代码的分解式UTITITIT
  • 在Java中运行.NET代码的工具 - 所有ikvm转换都是Java> .net

支持

  • .NET框架4.7.2及更高(SDK风格的项目)
  • .NET 6及更高
  • Java SE 8
  • Windows X86/X64/ARM64
  • Linux X64/ARM/ARM64(GLIBC和MUSL)
  • Mac OS X X64/ARM64

对我们所有不同人工制品的支持之间存在各种差异。例如,有一些我们无法为图像分发的平台,以及我们无法为工具分发工具的一些平台。

安装

nuget

 PM> Install-Package ikvm

或者,使用MavenReference

 PM> Install-Package ikvm .Maven.Sdk

工具

这些工具可在版本页面上下载。

运行时图像

JRE和JDK运行时映像都可用。这些图像是包含所有标准工具的标准JRE或JDK目录结构:Javac,jdeps,PolicyTool,Keytool等。某些Java库可能需要JRE或JDK,如果是这样,则应将ikvm .Image.JREikvm .Image.JDK添加到您的项目中。

ikvm.Image.JRE PM> Install-Package 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式项目集成的两个主要入口点是ikvm ReferenceMavenReference 。 .NET SDK风格的项目可以直接在命令行上构建,也可以使用支持它们的IDE,例如最近版本的Visual Studio或Jetbrains Rider。

ikvm参考

ikvm包括用于将Java库转换为.NET组件的构建时间支持。在需要引用Java库的项目中安装ikvm软件包。在ItemGroup中使用ikvm Reference来指示您的项目所需的Java库。

例子

ikvm" Version="Version" /> < ikvm Reference Include="....exthelloworldhelloworld-2.0.jar" /> ">
< ItemGroup >
  < PackageReference Include = " ikvm " Version = " Version " />
ItemGroup >

< ItemGroup >
  < ikvm Reference Include = " ....exthelloworldhelloworld-2.0.jar " />
ItemGroup >

输出组件将作为您项目构建过程的一部分生成,并将自动添加参考,以便您调用编译.jar组件的API。可以将其他元数据添加到ikvm Reference中,以自定义生成的程序集。

句法

ikvmReference Include="....exthelloworldhelloworld-2.0.jar"> MyAssembly 3.2.1.0 3.0.0.0 true true MyAssemblyFallback 3.1.0.0 MyKey.snk true SomeInternalDependency.jar;SomeOtherInternalDependency.jar MyClass.java;YourClass.java SomeExternalDependency.jar;SomeOtherExternalDependency.jar MyAssemblyAlias;helloworld2_0 portable ">
< ItemGroup >
   < ikvm Reference Include = " ....exthelloworldhelloworld-2.0.jar " >
      < AssemblyName >MyAssemblyAssemblyName >
      < AssemblyVersion >3.2.1.0AssemblyVersion >
      < AssemblyFileVersion >3.0.0.0AssemblyFileVersion >
      < DisableAutoAssemblyName >trueDisableAutoAssemblyName >
      < DisableAutoAssemblyVersion >trueDisableAutoAssemblyVersion >
      < FallbackAssemblyName >MyAssemblyFallbackFallbackAssemblyName >
      < FallbackAssemblyVersion >3.1.0.0FallbackAssemblyVersion >
      < KeyFile >MyKey.snkKeyFile >
      < DelaySign >trueDelaySign >
      < Compile >SomeInternalDependency.jar;SomeOtherInternalDependency.jarCompile >
      < Sources >MyClass.java;YourClass.javaSources >
      < References >SomeExternalDependency.jar;SomeOtherExternalDependency.jarReferences >
      < Aliases >MyAssemblyAlias;helloworld2_0Aliases >
      < Debug >portableDebug >
   ikvm Reference >
ItemGroup >

属性和元素

以下值可以用作< ikvm Reference>的属性或嵌套元素。

属性或元素描述
Include (仅属性) ikvm Reference项目的身份。该值可以是:
  • 通往罐子文件的路径
  • 通往目录的路径
  • 原本不重要的名字
AssemblyName默认情况下,使用Automatic-Module-Name规范定义的规则生成AssemblyName 。为了覆盖这一点,请在这里这样做。该值不应包括文件扩展名, .dll将自动附加。
AssemblyVersion默认情况下,使用Automatic-Module-Name规范定义的规则生成AssemblyVersion 。为了覆盖这一点,请在这里这样做。
AssemblyFileVersion默认情况下,使用由Automatic-Module-Name规范定义的规则或(如果覆盖)与AssemblyVersion相同的值生成AssemblyFileVersion 。为了覆盖这一点,请在这里这样做。
DisableAutoAssemblyName如果true禁用了AssemblyName的检测。
DisableAutoAssemblyVersion如果true禁用了对AssemblyVersion的检测。
FallbackAssemblyName如果未提供或无法计算AssemblyName ,请使用此值。
FallbackAssemblyVersion如果未提供或无法计算AssemblyVersion ,请使用此值。
KeyFile指定包含加密密钥的文件名。使用此选项时,编译器将公共密钥从指定的文件插入汇编清单中,然后用私钥签署最终程序集。
DelaySign此选项使编译器保留在输出文件中的空间,以便稍后可以添加数字签名。如果您只想将公共密钥放入组件,请使用DelaySign 。除非与KeyFile一起使用, DelaySign选项没有效果。
Compile半彩色的Java类路径项目列表以编译为组件。默认情况下,如果项目的身份是现有的JAR文件或目录(尚未支持),则此值是项目的Identity 。支持MSBuild Globs参考多个JAR或.class文件。
Sources在文档生成期间要使用的半彩列列表。 (尚未支持)
References可选的半彩色分离列表的其他ikvm Reference身份值,以指定为当前的参考。例如,如果foo.jar依赖于bar.jar ,则将两者都作为ikvm Reference项包含,但在foo.jarReferences数据上指定bar.jar的身份。
Debug可选值表示如何生成调试符号。默认情况下,这是根据项目的属性确定的。目前仅支持完整的调试符号。
Aliases半彩色分离的别名列表,可用于引用References中的组件。
ClassLoader自定义classloader实现的完全合格的类名称,以用作委托父母。示例包括ikvm .runtime.AppDomainAssemblyClassLoaderikvm .runtime.ClassPathAssemblyClassLoader
Reference MSBuild项目组定义上支持的所有其他元数据。

ikvm Reference不是传递的。将其包括在一个项目中并从第二个项目中增加该项目的依赖性不会导致第二个项目中的相同参考。而是将参考添加到每个项目。

对于每个项目,可以解决相同的组装,请确保其设置相同。

可以将多个ikvm Reference条目配置为相互包括为参考。

ikvmReference Include="helloworld.jar"> 1.0.0.0 < ikvm Reference Include="helloworld-2.jar"> helloworld-2 2.0.0.0 helloworld.jar helloworld2 ">
< ItemGroup >
   < ikvm Reference Include = " helloworld.jar " >
      < AssemblyVersion >1.0.0.0AssemblyVersion >
   ikvm Reference >
   < ikvm Reference Include = " helloworld-2.jar " >
      < AssemblyName >helloworld-2AssemblyName >
      < AssemblyVersion >2.0.0.0AssemblyVersion >
      < References >helloworld.jarReferences >
      < Aliases >helloworld2Aliases >
   ikvm Reference >
ItemGroup >

Automatic-Module-Name规范

Automatic-Module-Name是JAR清单的指定属性,可以在JAR内的META-INF/MANIFEST.MF文件中找到,或者基于JAR文件的名称生成的值。有关更多信息,请参见文档。

MavenReference

有关使用说明,请参见ikvm -Maven Readme。

通知项目所有者

ikvm项目建议,除非您是该软件的原始所有者,并且有令人信服的原因,否则人们不要将与ikvm一起编写的ikvm库Java库。

创建FOSS Java库的副本,并将其发布到分发机制(例如Nuget.org)上,从而在下游产生了生态系统混乱和依赖性冲突。我们提供了一个系统,以便Java库的.NET用户可以将这些库直接引用到标准Java生态系统机制:Maven Central等,但虽然ikvm .Maven。请记住,真空中很少有图书馆。图书馆通常取决于其他数十个库。两个无关的Java库通常取决于同一基础Java库。依赖冲突解决方案和版本统一的一种复杂的方法必须参与为任何个人下游项目解决此层次结构。您可能会向您的版本用户介绍重复的类,或者使用户依赖其他库的错误版本。

除上述内容外,我们目前不认为静态编译的组件与ikvm .Java和ikvm .runtime库之间的API保持稳定。即使在补丁级别上,也不会针对更高版本的ikvm构建的静态编译的组装,这也不是与更高版本的ikvm相对的。我们想在将来对此做出更好的支持,但是目前, ikvm .runtime和ikvm .Java .Java Apis计划了很多工作,我们不想抑制。由于我们还提供构建工具,使从构建机器中重新编译组件的过程变得容易,如果遵循建议,这应该有限。

此建议有例外,例如图书馆未发布给Maven。在这种情况下,指导是提倡原始的Java库实际上出版给Maven,或者自己做工作,因为这是Java库的合适地方。

我们不能强迫您遵守此建议。但是对于生态系统的健康,我们敦促您自己考虑。

下载源码

通过命令行克隆项目:

git clone https://github.com/ikvmnet/ikvm.git