为什么 NetBeans 运行 我的程序在 OS X 上,但没有将它构建到 JAR 中?

Why is NetBeans running my program on OS X, but not building it into a JAR?

tl;dr

我缺少什么依赖项允许 NetBeans 运行 OS X 集成程序在内部很好,但不能清理并将其构建到 JAR 中?


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

到目前为止,一切都很好。我已经将我的菜单栏集成到 OS X 中,我有 Preferences Handlers 和 About Handlers 以及所有有趣的东西,它工作得很好......当我点击 [= NetBeans 中的 51=]。然而!当我点击 Clean and Build 时,我收到很多很多这样的错误:

/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 <br/>
        @Override public void handleAbout(AppEvent.AboutEvent ae) {
        ^

为什么我可以运行它在IDE就好了,但是我不能告诉IDE把它编译成JAR?


已尝试修复

我尝试了 Ajith John 的修复方法,即通过创建一个全新的 NetBeans 项目、将所有源文件复制到其中并单击 "Clean and Build" 来完全重新创建项目。我得到了相同的结果,所以 这没有用。

NetBeans 具有硬组织的 运行 功能。如果我做对了 - 此函数编译并 运行 您在 NetBeans 进程(及其类路径)中的应用程序。 要通过 "build" 命令解决编译问题,您应该确保您的构建代理具有所有必要的依赖项:

  • 对于 Maven - 你应该在 pom.xml,
  • 中添加依赖
  • 对于 ant - 您应该指定类路径以将必要的 .jar 添加到其中。

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

我当前的解决方法是clean-and-run程序(不是构建),然后放置.class 文件和 .zip 文件夹以及 properly-formatted META_INF 文件夹和 manifest.MF 文件。然后我将 .zip 扩展重命名为 .jar,并使用这个 hacked-together jarfile!

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

一种解决方案是使用 javac 选项 -XDignore.symbol.file,如下所示。但是,-XD 选项是非标准且未记录的,请参阅 here and here

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