知识大全 在.NET上运行Java IKVM.NET入门
Posted 文件
篇首语:当筵意气临九霄,星离雨散不终朝。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在.NET上运行Java IKVM.NET入门相关的知识,希望对你有一定的参考价值。
在.NET上运行Java IKVM.NET入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一 介绍
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 Win ] 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实现
二 项目状态
此项目目前正在开发 将最大化实现与JDK 的兼容 但是仍存在一些漏洞(尤其在Classpth API中)
* AWT和Swing还未有功能
* 安全性是IKVM平台的一个大遗漏 此问题将依靠 NET平台提供的旧有的 但功能强大的安全模式而被解决 虽然这样 目前项目已具备能成功运行大型java项目的能力
三 IKVM原理
如何替换JVM IKVM应用包含了采用 NET实现的java虚拟机 在一些场合 我们可以用它替换掉java 例如 java jar myapp jar 将被替换为 ikvm jar myapp jar
在 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使用入门
系统准备Windows平台 Microsoft NET Framework SDK Windows或者Linux平台 Mono Framework
开始安装在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
设置环境在我们开始编写代码之前需要准备一下我们的环境 添加以下路径到系统PATH环境变量中 * 包含IKVM执行文件的目录
* 包含C#编译器(在Windows/Mono中为csc)的目录 通常在Windows中为C \\WINDOWS\\Microsoft NET\\Framework\\v * 包含java编译器(javac或者jikes)的目录
动态执行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手册
将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
在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出现在当前目录
cha138/Article/program/net/201311/11807相关参考
cha138/Article/program/Java/JSP/201311/20614
VB.NET如何在没有.NET框架的机器上运行 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 制
Java多线程程序设计入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java语言产生前传
Java多线程程序设计初步入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java语言产生
知识大全 java中的分布式是什么意思,和在同一台电脑上运行的程序有什么区别?
java中的分布式是什么意思,和在同一台电脑上运行的程序有什么区别?分布式,你可以理解为子节点可以独立运行例子:你开一家店,你就是服务器-客户端的架构,哪天你的生意壮大了,你就开了十家分店,这就相当于
知识大全 打算自学java入门书籍 有点迷茫 据说入门不适合先看java程式设计思想 希望能给我推荐一本比较易懂的书
打算自学java入门书籍有点迷茫据说入门不适合先看java程式设计思想希望能给我推荐一本比较易懂的书疯狂的java讲义我是学过C的,想学Java,求推荐书,java程式设计思想这书教入门吗?JAVA程
VB.NET入门--Imports语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 导入在引用
知识大全 ASP.NET入门教程 11.4 在代码中使用角色[1]
ASP.NET入门教程11.4在代码中使用角色[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 ASP.NET入门教程 11.4 在代码中使用角色[2]
ASP.NET入门教程11.4在代码中使用角色[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
支持入门—ASP.NET常用技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在上一篇《深入A