eclispe---两个虚拟机和多个classloader的故事

当你开发eclipse插件或rcp应用的时候,经常可能遇到ClassNotFoundException或java命令行问题或系统参数问题,例如java.endorsed.dirs.

    这种问题多出现在开发者不了解eclipse的运行机制。eclipse运行中存在两个进程,每个包都有自己的classloader.一旦你理解了这种机制是如何协同工作,解决问题相对简单多了。

 eclispe的启动进程

为什么eclispe需要启动两个进程?最简单的答案是eclipse应用软件需要几套系统参数才能正常运行。这包括诸如osgi.configuration.areaosgi.instance.area.之类的参数。在eclipse的启动过程中,这种需求是必要的。因为eclipse需要知道,它需要知道它在哪个位置存放临时数据和持久化数据。这种数据不能直接存放在你的某个项目下(例如你的配置选项和跟踪文件修改的历史记录)

 很多其他工具使用带有定制classpath脚本(或windows下的批处理)来启动一个应用(application);不仅是一些IDE,许多服务器端(server-side)的应用(例如Maven,Ant,cruiseConstorl......)都是如此。大部分时间,这些脚本使用特定环境下的例程增加需要的Jar库到classpath.总得来说,这种途径工作起来很正常。但是有些操作系统的表达方式比较特别,除非你对它的脚本编程比较熟悉,否则,工作起来比较困难。同时也意味着,你不得不经常测试你的脚本语句,来达到你的需求。当然你的脚本在大部分的unix system上能够工作正常。

为了解决这种类型的以及其他有关的问题。eclipse不使用脚本变量也启起它自身。它使用平台依赖的可执行程序,分析命令行参数(例如-vmargs),并把这些参数传递给osgi平台。重要的是,它为一些未在命令行提供的参数提供默认参数。它把osgi平台运行在一个新的进程中(OSGI VM),并把启动过程的其余部分进行处理完成。

 你许也很奇怪,它已经启了一个新的进程了,为什么不在这个java VM中把启动需要处理的其它部分在这个VM中继续处理?有两个原因:1、osgi平台可以调用system.exit,而不会把启动它的进程中止。2、这允许osgi用另一套完全不同的系统参数,或不同版本的VM,第一个进程可以运行在许多版本的VM上,但它可以保证你的平台运行在一个特定的版本上。例如,可以使用一个你发布的时候放在jre目录下一的特定java.

启动进程可以读取配置参数文件,例如eclipse.ini文件,这是一个以换行符分隔的配置文件,其中的参数被输入到平台VM中,-vmflag用来传递一系列参数作为VM参数,而不是普通参数.

也就是说,当startup.jar启动eclipse时,参数和选项将被实际的eclipse实例忽略。你可能认为

eclipse -Xmx1024m 

将给你一个非常大的内存,事实上,你的参数被eclipse 的laucher(startup.jar)给忽略掉了。native laucher(eclipse.exe)直接处理一些参数,其余的参数,被传递给真正做实际初始化工作的org.eclipse.core.launcher.Main native launcher处理的参数为

-vmargs
跟随其后的参数直接传递给平台runtime.的java命令行中,这个参数必须是最后一个参数,因为它后面的所有参数都将传递给下一个VM,请注意你的参数一定要格式良好,否则会报"Program/Eclipse cannot be located"这类错误,这大概是因为参数中有类似 C:/Program Files/Eclipse这种参数吧。 in them. 这些参数可以从 eclipse.vmargs 系统属性中取得,但VM启动后,就不能修改了
.未完待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值