Java Jar控制台应用程序打开Mac系统菜单栏

时间:2015-10-20 12:49:20

标签: java macos swing gradle jar

我有一个Java控制台应用程序,当我运行java -jar jarfile.jar <args>时,它会打开Mac上的系统菜单栏(屏幕顶部的菜单栏)。我没有使用Swing而且我没有任何GUI。菜单栏中的应用程序名称仅为<package>.<mainClass>,菜单仅包含例如关于,退出。

由于我在运行脚本时多次调用它,这对我来说有点令人不安,我想禁用它。

我正在使用gradle进行构建,我构建了这样的jar:

jar {
  baseName = 'appname'
  from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
    exclude "META-INF/*.SF"
    exclude "META-INF/*.DSA"
    exclude "META-INF/*.RSA"
  }

  def commit = "git rev-parse --short HEAD".execute().text.trim()

  manifest {
    attributes(
      'Implementation-Title': 'appname',
      'Implementation-Version': '1.0',
      'Commit-Id': commit,
      'Built-By': System.getProperty('user.name'),
      'Built-Date': new Date(),
      'Built-JDK': System.getProperty('java.version'),
      'Main-Class': mainClassName
    )
  }
}

dependencies {
  compile 'com.lowagie:itext:2.1.3'
  compile 'com.itextpdf:itext-hyph-xml:5.1.0'
}

这可能吗?您还需要其他信息吗?不幸的是,我不知道导致菜单栏出现的原因,所以我真的不知道还应该提供什么。

我创建了一个示例gradle-project:没有菜单栏,即使我添加了我的依赖项。我也尝试设置属性apple.laf.useScreenMenuBar,但这对我没有任何影响。

2 个答案:

答案 0 :(得分:3)

如果添加以下命令行选项:

-Djava.awt.headless=true

到脚本中的java命令行,然后AWT不会尝试自己初始化,并且不会显示菜单元素,如菜单栏。

答案 1 :(得分:2)

  

这可能吗?

Using Headless Mode in the Java SE Platform中所述,某些“重量级组件需要操作系统级别的对等方”。 Mac OS X通过添加可以根据建议application menuhere修改的最小here条目,将包含此类组件的应用程序集成到桌面环境中。当这样的重量级组件被实例化时,即使是懒惰,也会触发该行为。使用-verbose可能有助于识别违规容器。错误报告STS-3692表明这个问题很难解决。

作为参考,ImageJ有类似的问题,需要使用headless mode中适用的特殊headless.jar;对于example,可能有类似的gradle方法,但我没有尝试过。

相关问题