19

Eclipse IDE 是用 Java 编写的大型桌面应用程序的最佳示例之一。

我见过的大多数 Java 应用程序通常依赖批处理或 shell 脚本来构建带有应用程序类路径的字符串,并使用类路径作为 env 变量启动 JVM。

另一方面,Eclipse 依赖于本机启动器。这是为什么 ?这个启动器做了哪些脚本没有做的事情?

我记得大约一年半前读过一篇文章,解释说“我们最好使用原生启动器”,但 id 没有解释启动器的内部工作原理。

4

3 回答 3

24

Equinox 启动器使用 JNI在与启动器相同的进程中启动 Java VM。使用 JNI 还允许我们在启动屏幕中使用 SWT 小部件。


实际上,您仍然可以拥有一个脚本,因为启动器可执行文件 eclipse.exe 自 3.3M5 以来已被分成两部分:

  • 可执行文件,以及
  • 一个共享库(例如:eclipse_1006.dll)。

可执行文件位于 eclipse 安装的根目录中。
共享库位于org.eclise.equinox.launcher.[config]插件目录中的特定于平台的片段中。

将大部分启动器代码移动到位于片段中的共享库中意味着现在可以从更新站点更新该部分启动代码。此外,从 java 启动时,可以通过 JNI 加载共享库以显示启动画面。

正如这里所解释的,您可以在没有本机启动器的情况下启动 Eclipse 3.3

java -jar plugins/org.eclipse.equinox.launcher_1.0.0.v20070319.jar

请注意,jar 文件的名称现在取决于版本,导致使用确切文件名调用 jar 的幼稚脚本在 jar 文件更新后中断。

相反,您可能想要查找与org.eclipse.equinox_*.jar. 值得庆幸的是,Eclipse-wiki 包含在这种情况下有用的适当脚本模板。
如果不想修改已有的脚本,也可以搜索Equinox Launcher插件,复制到Eclipse主目录,将复制的内容重命名为startup.jar。

于 2009-01-26T12:16:32.257 回答
10

其中一些是特定于窗口的,一些是通用的。

  1. 与目标平台的本机可用脚本语言中的批处理脚本相比,您的 shell 集成有了很大改进。

  2. 无需启动额外的进程来执行脚本(如果您将 IDE 本身编写为构建/测试/部署周期的一部分,这可能很重要。

  3. 可执行头文件通常定义程序的“位数”。因此,可执行文件可以明确指示它允许/禁止 32 位或 64 位执行。

  4. Windows 上的可执行文件可以进行加密签名。

  5. 许多恶意软件/防火墙防护程序维护每个可执行的白名单。因此,在第一次启动 Eclipse(并且它会检查网络上的更新)时,它会更好地显示“Eclipse 正在尝试访问互联网”而不是通用的“javaw.exe”。试图访问互联网”。它还允许用户更精细地控制此行为。

  6. 该进程将在 ps/task manager 上显示为“you_app_name”,而不是 java -jar “your jar file”。这使得跟踪/管理错误进程变得更加容易。在开发环境中并不少见。

于 2009-01-26T12:10:29.927 回答
5

其他答案是高度技术性的,但在我看来,我认为其原因要简单得多:用户体验。

最终用户不必大惊小怪地让它工作。(是的,如果你想使用不同的虚拟机或将参数传递给虚拟机等,你可以大惊小怪,但你不必这样做)。

没有什么比安装一个程序更让用户讨厌的了,然后尝试运行它,只是得到一个 dos 框,上面写着“输入你的 java vm 的路径”,或者更糟糕的是,你双击它并没有任何反应,因为你有去编辑一个批处理文件以使其工作。

这是 2009 年,而不是 1996 年。没有用户(甚至开发人员!)不应该编辑批处理文件以使程序第一次运行。

于 2009-01-26T19:36:09.513 回答