当你开发eclipse插件或rcp应用的时候,经常可能遇到ClassNotFoundException或java命令行问题或系统参数问题,例如java.endorsed.dirs.
这种问题多出现在开发者不了解eclipse的运行机制。eclipse运行中存在两个进程,每个包都有自己的classloader.一旦你理解了这种机制是如何协同工作,解决问题相对简单多了。
eclispe的启动进程
为什么eclispe需要启动两个进程?最简单的答案是eclipse应用软件需要几套系统参数才能正常运行。这包括诸如osgi.configuration.area 和osgi.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处理的参数为
-vmargsC:/Program Files/Eclipse这种参数吧。
in them. 这些参数可以从
eclipse.vmargs
系统属性中取得,但VM启动后,就不能修改了