关闭

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

标签: classloader虚拟机eclipseosgieclipse插件脚本
1346人阅读 评论(0) 收藏 举报

当你开发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启动后,就不能修改了
.未完待续
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7900次
    • 积分:164
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:2篇
    • 评论:1条
    文章存档
    最新评论