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

翻译 2006年05月16日 20:22:00

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

两个程序员的故事

iamlaosong评 这个故事并不是空穴来风,就像我曾经感叹过的,有的公司因程序不断升级而赚的盆满钵满,甚至专门养几个人为客户维护,而且是客户买单;有的则因程序完善没有后续什么事成了一锤子买卖。经常...
  • iamlaosong
  • iamlaosong
  • 2017年07月28日 09:24
  • 227

在VMware里面建两个或者多个linux系统联网,网络配置。

1:首先看下宿主主机的网络配置 一定要安装 VMware Bridge Protocol 我本机用的是以太网,上面是网关和ip地址设置 2:VMware   编辑   -》 虚拟网...
  • sgl520lxl
  • sgl520lxl
  • 2017年04月20日 12:18
  • 2226

一台虚拟机搭建多个tomcat方法

标签:Linux 搭建 tomcat 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://fangwei009.blog.51c...
  • zxl2016
  • zxl2016
  • 2017年06月20日 17:54
  • 635

开发笔记:导航控制器(二)(故事板)push modal custom

在苹果公司的官方demo 可以看出 已经更新了用故事板模式 布局UI ,  故事板模式给程序员带来了很大的方便, 在页面之间的跳转通过拖拽,也变的非常简单,也更加清晰的看见应用程序是如何布局的,对与其...
  • lengshengren
  • lengshengren
  • 2013年11月20日 16:34
  • 3505

使用自己的ClassLoader实现热替换

首先实现一个自己的ClassLoader
  • is_zhoufeng
  • is_zhoufeng
  • 2014年05月22日 17:00
  • 9321

一个程序员的真实故事上

这是一个真实的故事,关于作为程序员的身体健康问题,目的警示大家一定要注意身体,多锻炼身体,身体是革命的本钱,永远比金钱重要。...
  • zhangdeTalk
  • zhangdeTalk
  • 2016年05月18日 12:08
  • 2971

通过克隆虚拟机来创建多个虚拟机

原链接:http://blog.sina.com.cn/s/blog_9ba89b9901019bn9.html 用好Vmware Workstation 的克隆来简化虚拟机的安装配...
  • u010619243
  • u010619243
  • 2017年01月18日 10:33
  • 1473

Java虚拟机ClassLoader入门

最近有强烈的欲望看《深入Javax》
  • cqu20093154
  • cqu20093154
  • 2014年09月03日 13:57
  • 673

自定义ClassLoader,让spring加载外部的配置文件和类

今天同事遇到一个需求: 在外部以jar包的形式存放若干个插件,其中包含插件的类,以及spring配置文件;jar包不在classpath里 要实现这个需求,需要用到自定义的ClassLoader,...
  • kyfxbl
  • kyfxbl
  • 2013年09月24日 11:14
  • 3843

Java虚拟机--ClassLoader(十九)

目录:ClassLoader工作在Class装载的加载阶段,主要作用是从系统外部获得Class二进制数据流    知识点的梳理: 当系统需要加载一个类时,会先从顶层的启动类加载器开始加载,逐层往...
  • qq_33301113
  • qq_33301113
  • 2017年05月28日 09:24
  • 499
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:eclispe---两个虚拟机和多个classloader的故事
举报原因:
原因补充:

(最多只允许输入30个字)