在.NET平台运行Java程序-IKVM.NET入门

程序

摘要

  IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序。本文将比较详细的介绍这个工具的原理、使用入门(如何java应用转换为.NET应用、如何在java中开发.NET应用),希望能给大家带来惊喜。

一、介绍

  IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序。它包含了以下的组建:
* 一个用.NET实现的java虚拟机
* 一个java类库的.NET实现
* 致力于在java和.NET之间交互的工具

二、IKVM.NET的组件

  IKVM.NET包含以下的部分:
* IKVM.Runtime.dll: VM运行时和所有支持代码。它包括以下的功能:
   Byte Code JIT 编译器和验证器: 使用JIT将Java Byte Code编译为CIL(C中间语言)。
   对象模式映射结构: 将.NET中的System.Object,System.String,System.Exception映射为java代码中的java.lang.Object, java.lang.String,java.lang.Throwable。
   管理本地方法(在Classpath中)的.NET重新实现。
* IKVM.GNU.Classpath.dll: 被编译的GNU Classpath版本,它是由自由软件基金会实现的java类库和一些IKVM.NET附加代码组成的。注意:这里的GNU Classpath不是IKVM.NET的一部分,但是前者被用在IK.VM.NET中。
* IKVM.JNI.[Mono|CLR-Win32].dll: 通过实现JNI接口管理C++汇编。作为一个可选部分,只在程序使用自己的本地库时才被用到。而对于纯java程序来讲是不会被用到的。
* ikvm.exe: 与java.exe很类似的启动执行程序(动态模式)。
* ikvmc.exe: 静态编译器,被用来编译java类和jar使其成为.NET汇编(静态模式)。
* ikvmstub.exe: 一个从.NET汇编生成存根类的工具,就如javap一样反编译.NET汇编。IKVM.NET了解如何存根并用实际的.NET类型引用替换对存根的引用。
* IKVM.AWT.WinForms.dll: 非常有限的零散AWT实现。

二、项目状态

  此项目目前正在开发,将最大化实现与JDK1.4的兼容,但是仍存在一些漏洞(尤其在Classpth API中)。
* AWT和Swing还未有功能。
* 安全性是IKVM平台的一个大遗漏。此问题将依靠.NET平台提供的旧有的、但功能强大的安全模式而被解决。 虽然这样,目前项目已具备能成功运行大型java项目的能力。

三、IKVM原理

1.如何替换JVM

  IKVM应用包含了采用.NET实现的java虚拟机。在一些场合,我们可以用它替换掉java。例如: java -jar myapp.jar 将被替换为 ikvm -jar myapp.jar。

2.在.NET应用中使用java类库

  IKVM.NET包含ikvmc,这个在java bytecode与.NET中间语言的转换器。如果我们使用一个被用在.NET平台的java库的话, 运行ikvmc –target:library mylib.jar(mylib.jar在这里指代我们的jar文件)来生成mylib.dll。例如apache FOP项目是一个开源的XSL-FO处理器项目,它使用java语言编写的用于从xml生成PDF文档。使用IKVM.NET技术,我们可以将apache FOP用在任何的.NET应用中。这样在开发.NET应用的同时利用IKVM便可以使用java开源项目这个免费的软件仓库。尽管在IKVM.NET没有提供在.NET中使用的java编译器,但是我们可用开源的Jikes编译器将java源代码编译为JVM bytecode,然后使用ikvmc –target:exe myapp.jar来生产.NET执行文件。我们甚至可以通过包含ikvmstub应用的方式在我们的java代码中用.NET API。

四、IKVM使用入门

1.系统准备

Windows平台:Microsoft .NET Framework 1.1 SDK
Windows或者Linux平台:Mono Framework 1.0

2.开始安装

  在Windows和Linux平台上安装过程是相同的,在下载二进制发布版后,将文件解压缩。打开命令或者shell窗口,cd进入ikvm\bin目录,执行ikvm。如果我们操作正确的话,我们将看到以下的输出:

usage: ikvm [-options] <class> [args...] (to execute a class) or ikvm -jar [-options] <jarfile> [args...] (to execute a jar file) ...

  为了方便使用,我们可将ikvm\bin目录加入到系统path。现在我们将使用IKVM就像使用JVM一样,并不需要配置。如果我们需要在.NET或者Mono环境下使用IKVM,请仔细阅读下面的文字说明:

* 首先下载Jikes编译器。如果我们计划开发在java中开发代码 运行于.NET环境的话,我们将要一个java编译器。IKVM.NET没有提供这个编译器,所以我们需要能生成标准java类文件的编译器。Jlikes是一个好选择,它是一个优秀的开源项目,并应用在多种平台。当然Sun提供的jdk也很好。

* 在Windows的全局汇编缓冲区中安装IKVM dll。在Windows中运行基于IKVM dll的.NET应用程序时,.NET框架必须定位这些dll的位置。系统首先在全局汇编缓冲区中查找,然后再当前目录中查找。如果我们想不在当前目录中安装这些dll文件的话,我们就要将它们安装在全局汇编缓冲区中:在Windows控制面板中访问.NET框架配置,增加一个汇编缓冲区。我们至少要安装IKVM.GNU.Classpath.dll和IKVM.Runtime.dll。

3.设置环境

  在我们开始编写代码之前需要准备一下我们的环境,添加以下路径到系统PATH环境变量中:
* 包含IKVM执行文件的目录。
* 包含C#编译器(在Windows/Mono中为csc)的目录,通常在Windows中为C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322。
* 包含java编译器(javac或者jikes)的目录。

4.动态执行java应用程序

  IKVM.NET包括了一个C#实现的java虚拟机。我们可以从一个例子开始——进入IKVMROOT\samples\hello目录,编译示例程序:

Javac Hello jar cfm hello.jar manifest.mf Hello.class

  现在,在使用javac编译了Hello类后,我们使用IKVM运行此类:

ikvm Hello 

  这个命令将启动IKVM,IKVM查找名为Hello.class的文件。如果找到,则将其装载并动态执行bytecode。此时Hello程序将要求我们输入名字,之后我们将看到一个问候信息。

  如果在上面的过程中发生问题,请检查下面的地方:
* 检查命令行: ikvm像java一样需要我们输入正确的类名。
* 如果ikvm报告ClassNotFoundException,请检查CLASSPATH环境变量是否被设置。如果被设置,请清除CLASSPATH或者将当前目录加入到CLASSPATH中以使ikvm能够在当前目录中找到类。

如果运行jar文件,我们可键入:

ikvm -jar hello.jar 

提示:详细的命令行选项可以参考ikvm手册

5.将java程序转换为.NET程序

  IKVM.NET包含ikvmc这个能够将jar文件转换为.NET的dll库文件和exe应用的工具。下面我们将学习如何将java应用转换为一个.NET执行文件:

  进入IKVMROOT\samples\hello目录输入以下命令:

ikvmc hello.jar

  注意:当我们使用Mono时,我们需要告诉ikvmc如何找到GNU Classpath dll,例如:

  ikvmc -reference:/usr/lib/IKVM.GNU.Classpath.dll hello.jar

  在命令执行完后,我们将发现hello.exe已被生成在当前目录:
* 在Windows/.NET环境下,如果我们得到了FileNotFound的异常,请记住检查.NET框架希望在当前目录或是全局汇编缓冲区中寻找dll文件。我们可以通过上面讲的方法将dll安装到全局汇编缓冲区中,或者将dll文件直接复制到当前目录。

* 在Linux/Mono环境下,我们使用下面的命令执行hello.exe:

mono hello.exe

6.在java中开发.NET应用

  首先进入IKVMROOT\samples\usenetapi目录,找到ShowDir.java文件,这个java应用使用了.NET API来显示当前目录下的文件列表。打开这个文件,我们会发现其导入的包名以cli开头,这些并不是java API包,它们是映射到.NET命名空间的“伪”包。需要查看更多信息请看IKVM的开发者手册

第一步:生成java存根文件

  IKVM没有提供java编译器,所以我们可以使用标准的java编译器。由于java编译器只能编译使用了java API的应用程序,而不是使用.NET API的应用。所以我们在这里需要“愚弄”一下java编译器使其相信名为cli.System.IO的包是一个真正的java包。帮助我们完成这项工作的是ikvmstub程序。它从.NET dll生成jar文件,这个被生成的jar文件包含了与.NET类对应的java类和接口,但是并不包含真正的代码,只包含一些映射信息。这样做便会通过java编译器的检查和编译:

ikvmstub mscorlib.dll

注意:在Linux Mono环境下,我们必须输入dll文件的完整路径,例如:
ikvmstub /usr/lib/mscorlib.dll

在编译完成后,我们将在当前目录下发现一个名为mscorlib.jar的文件。

第二步:编译java源代码

现在我们将编译java源代码,如果使用javac的话,可输入以下命令:

javac -classpath mscorlib.jar ShowDir.java

在命令完成后,ShowDir.class文件将出现当前目录下。

第三步:生成.NET执行文件

最后我们将转换java class文件为.NET应用程序,正如前面讲的:

ikvmc ShowDir.class

注意:在Linux Mono环境下,我们需要使用前面提到的-reference选项:

ikvmc -reference:/usr/lib/IKVM.GNU.Classpath.dll ShowDir.class

这时我们便可以看到ShowDir.exe出现在当前目录。

五、参考资源:
http://www.ikvm.net/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, 目录
, net
, 文件
, 编译器
, linux汇编
, java调dll
, mono
, 汇编类程序
, 汇编类问题
, ikvmc
, 一个
, java编译环境
java程序编译运行
,以便于您获取更多的相关知识。

时间: 2024-10-29 23:13:03

在.NET平台运行Java程序-IKVM.NET入门的相关文章

Win8.1系统无法运行Java程序的解决办法

  部分Win8.1系统用户发现在使用Java程序时,页面上留块空白和一个黑黑的叉叉,或者干脆无法运行程序.下面系统之家小编就为大家介绍一下Win8.1系统无法运行Java程序的解决办法! 1.确定你已经安装了Java; 2.确定你的IE已经启用了JAVA插件.IE选项->程序->管理加载项:[JAVA SE Runtime Enviroment]启用; 3.打开JAVA控制面板确认[启用浏览器中的JAVA内容]是否已勾选.计算机->控制面板->程序->JAVA->安全

cmd运行java程序-cmd指令运行java程序问题

问题描述 cmd指令运行java程序问题 用cmd指令运行java程序时,出现javac不是内部或外部指令提示,无法编译 解决方案 没有配置JAVA环境变量,看JDK部分http://blog.csdn.net/login950518/article/details/50720020 解决方案二: cmd运行Java程序的问题java程序获得windows系统的一些参数(cmd指令运行返回结果)java程序由于编码问题在cmd中运行失败 解决方案三: 是环境变量的问题,如果不配置的话,需要进入J

eclipse-Eclipse 运行java程序时出现错误

问题描述 Eclipse 运行java程序时出现错误 下面这张是我上一次运行的java程序 解决方案 main 函数要传递String args[] 如下: public static void main(String args[]) { } 解决方案二: 先编译 后运行 鼠标点击format.java的代码页面,就是现在这个页面 在这个页面下 ctr l+ s 编译当前文件 然后运行 解决方案三: 啥意思?这不是两个工程吗?要运行Format.java的话,选中这个文件,右键->Run as

java-请问如何在WINDOWS下后台运行JAVA程序而不打开命令行窗口

问题描述 请问如何在WINDOWS下后台运行JAVA程序而不打开命令行窗口 请问如何在WINDOWS下后台运行JAVA程序而不打开命令行 我添加了一个任务计划但是每次运行程序的时候都会打开命令行窗口我不希望命令行窗口出现怎么办? 解决方案 @echo off 你加入这个你再试试

ubuntu-Ubuntu下怎么运行Java程序

问题描述 Ubuntu下怎么运行Java程序 首先我的Ubuntu是装在虚拟机下的,然后我配置好了jdk环境,没有装开发工具. 我在windows下面用Eclipse编好的Java项目代码怎么在Ubuntu下面运行呢? 我试过把整个项目文件夹拖到Ubuntu的home路径下,然后在终端一个打开文件夹之后,用javac,java的命令行编译调试我主方法所在的类,但是报错... 解决方案 Ubuntu下也有Eclipse,用法完全一样,直接打开你在Windows下用Eclipse创建的的工作区就可以

java程序 不能运行-.java程序运行中出现的问题

问题描述 .java程序运行中出现的问题 为什么相同我在eclipse上运行java程序的时候只有run configurations选项而没有run Application选项,我的java刚入门,提的问题比较低级,请各位大神多多指教,非常感谢! 解决方案 没有run Application(运行应用)选项,很明显,你的文件里面没有Main函数,Main函数是程序的入口和出口,没了Main函数自然不能启动程序的.看看你的文件里面有没有:`public static void main(Stri

Java魔法堂:以Windows服务的形式运行Java程序

一.前言   由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅.   二.Java Service Wrapper   官网地址:http://wrapper.tanukisoftware.com/doc/english/download.jsp   JavaServiceWrapper以守护进程或windows服务的方式运行java程序.JSW提供四种方案改造原有项目,以实现守护进程或window

选择运行 Java 程序的方式

在运行 Java(TM) 程序时,您可以选择希望使用的方式.所有方式都验证代码并创建 Java 程序对象来存放预验证格式的程序.可使用下列任何一种方式: 解释方式 直接处理 "及时"(JIT)编译 "及时"(JIT)编译并直接处理 选择方式 详细信息 解释方式 在运行时对每个字节码进行解释. 有关以解释方式运行 Java 程序的信息,参见运行 Java(RUNJVA)命令. 直接处理 方法的机器指令在首次调用该方法期间生成并保存下来,以供程序下次运行时使用.并且,整

Java程序员快速入门Go语言

这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将详细的描述Go语言的各个构成模块,最后以一个例子来讲解Go语言与Java语言的不同点.   先来认识堆栈(例子) 为了满足大家的好奇心,我们将开始于一个麻雀虽小但五脏内全的例子,这个例子将是Stack.java的Go语言版本. 01 //实现堆栈的包集合 02 package collection