如何确保open命令在Mac上的Java应用程序中调用main函数

时间:2013-03-27 11:59:27

标签: java macos file-io command-line

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

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

使用“open -n”选项打开多个应用程序不是一种选择。

1 个答案:

答案 0 :(得分:2)

  

我很确定不会再次调用main函数

是的,当已经有一个应用程序运行实例时,“open”命令只是向正在运行的实例发送一个“打开文件”事件。您需要注册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)应该做正确的事。