为什么NetBeans在OS X上运行我的程序,而不是将其构建到JAR中?

TL;博士

我错过了什么依赖允许NetBeans在内部运行OS X集成程序,但是不能清理并构建它到JAR?


我正在尝试制作一个集成到OS X中的Java程序,但我希望将它发布到Windows和Linux上。 为此,我使用com.apple.eawt包的实用程序类。

到目前为止,它一直很棒。 我已将我的菜单栏集成到OS X中,我有首选项处理程序和关于处理程序以及所有有趣的东西,并且它工作得很好…当我只是单击在NetBeans中运行时。 然而! 当我单击“ 清理并生成”时 ,我会收到许多这样的错误:

 /my/source/path/MenuBarManager.java:3: error: package com.apple.eawt does not exist import com.apple.eawt.AboutHandler; /my/source/path/MenuBarManager.java:62: error: cannot find symbol private static class MyAboutHandler implements AboutHandler { ^ symbol: class AboutHandler location: class MyMenuBarManager /my/source/path/MyMenuBarManager.java:68: error: package AppEvent does not exist @Override public void handleAbout(AppEvent.AboutEvent ae) { ^ /my/source/path/MyMenuBarManager.java:67: error: method does not override or implement a method from a supertype 
@Override public void handleAbout(AppEvent.AboutEvent ae) { ^

为什么我可以在IDE中运行它,但我不能告诉IDE将其编译为JAR?


尝试修复

我试图通过创建一个全新的NetBeans项目,将所有源文件复制到其中,然后单击“清理并生成”来完成重新创建项目的Ajith John的修复。 我得到了相同的结果,所以这不起作用。

即使com.apple.eawt包位于运行时jar rt.jar (如果在OS X上),编译器ct.sym在名为ct.sym的符号文件中查找包。 符号文件仅包含标准Java包,而不包含Apple扩展。

一种解决方案是使用javac选项-XDignore.symbol.file ,如下所示。 但是-XD选项是非标准的且没有文档,请参见此处和此处 。

在此处输入图像描述

更好的解决方案可能是以不使用非标准Apple扩展的方式重写代码。

NetBeans具有硬组织的运行function。 如果我做对了 – 这个函数在NetBeans进程(及其类路径)中编译和运行你的应用程序。 要通过“build”命令解决编译问题,您应该确保构建代理具有所有必需的依赖项:

  • 对于Maven – 你应该只在pom.xml中添加依赖项,
  • 对于ant – 你应该指定classpath来添加必要的.jar。

PS包com.apple.eawt是Apple唯一的包。 如果您希望在其他平台上启动应用程序,则应使用简单的AWT(不是Apple EAWT)或其他常见的UI框架(例如Swing)。

我目前的解决方法是清理并运行程序( 而不是构建),然后将.class文件放入带有正确格式化的META_INF文件夹和manifest.MF文件的.zip文件夹中。 然后我将.zip扩展名重命名为.jar ,并使用这个被黑客攻击的.jar .zip