';秘制酱汁';在MacOS X专用Java API中-请求进一步详细信息

';秘制酱汁';在MacOS X专用Java API中-请求进一步详细信息,java,macos,Java,Macos,斯科特·科瓦奇在他的博客上写道: 在终端窗口中键入“java MyAWTCode”不需要太多细节,这违反了关于Mac OS X上的应用程序是什么的大量假设,需要AWT和流程管理器之间的大量合作来解决。 出于好奇-违反了哪些假设?当然,这只是带有回调的API调用的候选者 我不确定他在想什么,但我想一个很大的区别是文件结构:一个普通的MacOS X应用程序是一个包,其结构名为app.app/Contents/MacOS/nameofapp,具体文件在Contents目录中。当我们使用带有“java

斯科特·科瓦奇在他的博客上写道:

在终端窗口中键入“java MyAWTCode”不需要太多细节,这违反了关于Mac OS X上的应用程序是什么的大量假设,需要AWT和流程管理器之间的大量合作来解决。


出于好奇-违反了哪些假设?当然,这只是带有回调的API调用的候选者

我不确定他在想什么,但我想一个很大的区别是文件结构:一个普通的MacOS X应用程序是一个包,其结构名为app.app/Contents/MacOS/nameofapp,具体文件在Contents目录中。当我们使用带有“java”命令的终端时,JVM必须创建一个特定于java代码的“虚拟”应用程序,并为其处理所有MacOS事件。此外,当您在Finder中打开一个应用程序两次时,它只会在第二次激活该应用程序,而您每次使用“java MyAWTCode”时都需要启动单独的应用程序。

当然,我可以详细说明一下

Process Manager首先假设所有在Mac OS X上显示UI的应用程序都是捆绑的,打包在名为Application.app的文件夹中,在Contents/MacOS/Application中为binary,最重要的是,有一个Info.plist来获取应用程序菜单中显示的应用程序名称等信息。当您从命令行(Swing或SWT)运行Java应用程序时,没有Info.plist,因此我们必须创建一个CFDictionary,传递给将注册该应用程序的私有SPI,在Dock中给它一个适当的名称,而不仅仅是“Java”,并且可以强制退出

即使这样,它也不是完美的,因为当您右键单击并选择Keep In Dock时,Dock还假设它可以为捆绑的应用程序存储别名,但因为没有一个别名会自动失败。无法像Windows那样存储启动应用程序的快捷方式或命令行

SWT只调用TransformProcessType,这是一个开始,但远远不足以将Java应用程序转变为完整的UI应用程序。对于纯SWT测试和开发来说,这就足够让您开始了。当您为部署创建一个基于EclipseRCP的应用程序时,您将得到一个带有Eclipse启动器、插件和特性的捆绑应用程序,并且您已经准备好了


当然,如果您多做一点努力,将Java应用程序打包成一个捆绑包,这一切都是毫无意义的,但是绝大多数来自其他平台的开发人员并不费心,他们只想运行一个可执行的JAR文件,甚至是一个带有shell脚本的类文件文件夹。

那么这就是Mac版Java中所有关于“私有MacOS API”的大惊小怪之处了?真是疯了,不止这些。我相信也有一些Java2D的东西只能用私有API来完成,但我已经很久没有看到这些代码了。但是,我同意指责私有MacOSXAPI是一种转移注意力的做法。