【问题标题】:How to ensure that open command invokes main function in the Java application on Mac如何确保打开命令在 Mac 上的 Java 应用程序中调用 main 函数
【发布时间】:2013-03-27 11:59:26
【问题描述】:

我在 Mac 上有一个在 Eclipse 中构建的 java 应用程序,并使用名为 osxappbundle-maven-plugin 的 maven 插件捆绑。 在我解压应用程序的dmg文件后,获取一个App文件,并将其复制到我的硬盘驱动器,我通过终端使用以下命令调用该应用程序: open -a "/Full/Path/To/App/Match Player.app" --args "/Full/Path/To/File/TEST 1.mplx"

这会正确打开应用程序。
但是,在我执行以下命令后: open -a "/Full/Path/To/App/Match Player.app" --args "/Full/Path/To/File/TEST 2.mplx" 我的应用程序不会使用新的测试文件打开应用程序,而只是关注先前打开的应用程序的窗口。
我很确定不会再次调用 main 函数,因为我编写了 main 函数,因此在每次调用时,它都会重新初始化窗口。 (因此应用程序应该完全重新初始化)。

不能使用“open -n”选项打开多个应用程序。

【问题讨论】:

    标签: java macos file-io command-line


    【解决方案1】:

    我很确定主函数没有被再次调用

    是的,当已经有一个应用程序实例正在运行时,“打开”命令只是向正在运行的实例发送一个“打开文件”事件。您需要注册一个OpenFilesHandler 来接收此事件,并且您可以从处理程序内部再次调用main

    import com.apple.eawt.*;
    
    public class MyMainClass {
      private static boolean listenerRegistered = false;
    
      public static void main(String[] args) throws Exception {
        if(!listenerRegistered) {
          Application.getApplication().setOpenFileHandler(new OpenFilesHandler() {
            public void openFiles(AppEvent.OpenFilesEvent evt) {
              List<String> filenames = new ArrayList<String>();
              for(File f : evt.getFiles()) {
                filenames.add(f.getAbsolutePath());
              }
              MyMainClass.main(filenames.toArray(new String[filenames.size()]));
            }
          });
          listenerRegistered = true;
        }
    
        // rest of main goes here
      }
    }
    

    现在open -a "/Full/Path/To/App/Match Player.app" "/Full/Path/To/File/TEST 1.mplx"(没有--args)应该做正确的事情。

    【讨论】:

    • 这还能用吗?我无法让 OpenFileHandler 工作。双击文件后,我的应用重新聚焦,但从未调用过 OpenFileHandler!
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2019-01-21
    • 2019-06-22
    相关资源
    最近更新 更多