当前位置: 首页 > news >正文

java虚拟机的启动实例--eclipse的方式

查看eclipse的源代码,有以下一个zip压缩包:
src\plugins\org.eclipse.platform\launchersrc.zip
这是eclipse的启动源码包,解压后有一个launchersrc\library目录,该目录中有一个文件eclipse.c(高一些的版本需要看的是eclipseMain.c),这就是eclipse的带有main函数的主文件,它和一个它依赖的文件最终编译成eclipse这个可执行文件。
eclipse是由java写成的,然而其启动文件却是一个平台可执行文件-elf/pe,那么一定是eclipse可执行程序启动了java环境。在这些c代码中,最终要调用一个函数:startJavaVM或者launchJavaVM,而这些函数最终有两种实现方式,一种是fork/exec+wait的方式,这样的话当你运行eclipse的时候ps或者查看进程管理器的时候就会发现有两个进程,一个是eclipse,另一个是javaw或者java,它主要的优点是可以自己定义java环境的所在地...另一种方式是直接调用JVM的接口启动java环境,就是类似java程序做的那样,它自己搜索java环境的所在,同时它也是可以指定参数的,程序相对比较紧凑一些。
既然eclipse只是一个壳,那么我们显然可以绕开这个壳,它无非就是一个和java程序类似的东西,只是更漂亮一些罢了。查看下面目录的源码,发现作者没有改变入口,仍然以main方法为入口,因此完全可以用java命令来启动:
src/plugins/org.eclipse.equinox.launcher/src/org/eclipse/core/launcher/Main.java
这个Main.java是eclipse的启动类,也是被调用的第一个类,其很简单地调用了下面的过程:
org.eclipse.equinox.launcher.Main.main(args);
在下面的目录可以找到这个被调用的main:
src/plugins/org.eclipse.equinox.launcher/src/org/eclipse/equinox/launcher/Main.java
最终invokeFramework方法被调用,一切正式开始。之所以将启动程序封装成一个平台相关的可执行文件(elf/pe等),其主要原因就是启动很方便,不需要进行命令行输入,任何的GUI上直接点击即可,并且还能定制平台相关的启动风格。使用java命令直接启动eclipse的方法如下:
java -jar $eclipse的目录/plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
eclipse是一个可执行文件,它可能被病毒感染,然而即使它被感染了,直接使用java命令启动的IDE可能还是好的,除非java本身也被感染了...此时还可以自己写启动程序,除非jvm动态库被感染了,此时我们还可以重新下载,除非互联网被感染了!

相关文章:

  • 本地方法中printf如何传给java--java系统级命名管道
  • OUYA游戏开发核心技术剖析大学霸内部资料
  • 解决windows 10 9926 中vmware安装的虚拟机无法桥接上网的问题
  • 字符设备驱动程序
  • html中#include file的使用方法
  • 天龙客户端的ResourceManager
  • 我想改了我的音箱
  • sql server 中引號嵌套
  • jsfDemo
  • 第二章
  • 【转】风雨20年:我所积累的20条编程经验
  • 模拟银行账户汇款操作(并发控制)
  • .net 无限分类
  • js 重新梳理 1:indexOf与serch 的区别
  • 继承重载重写多态
  • (三)从jvm层面了解线程的启动和停止
  • [Vue CLI 3] 配置解析之 css.extract
  • ES6系统学习----从Apollo Client看解构赋值
  • java多线程
  • Laravel5.4 Queues队列学习
  • learning koa2.x
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Service Worker
  • vue-cli在webpack的配置文件探究
  • 阿里云应用高可用服务公测发布
  • 技术发展面试
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $(selector).each()和$.each()的区别
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ..回顾17,展望18
  • ./和../以及/和~之间的区别
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net core 连接数据库,通过数据库生成Modell
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 解决重复提交问题
  • .net 托管代码与非托管代码
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET的微型Web框架 Nancy
  • .NET框架
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • /etc/fstab 只读无法修改的解决办法
  • @angular/cli项目构建--Dynamic.Form
  • @EnableWebMvc介绍和使用详细demo
  • []FET-430SIM508 研究日志 11.3.31
  • [AIGC 大数据基础]hive浅谈
  • [AIGC] MySQL存储引擎详解
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [Asp.net MVC]Bundle合并,压缩js、css文件