2015-10-20 22 views
2

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

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

我使用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,但这对我也没有任何影响。

回答

3

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

-Djava.awt.headless=true 

到脚本中java命令行,然后AWT不会试图初始化本身和GUI元素,如菜单栏将不再呈现。

+0

谢谢!那工作。 – dinfuehr

2

这可能吗?

如在Using Headless Mode in the Java SE Platform中讨论的,某些“重量级组件需要操作系统级别的对等体”。 Mac OS X通过添加最小的application menu条目,将包含此类组件的应用程序集成到桌面环境中,该条目可按建议的herehere进行修改。当这样一个重量级的组件被实例化时,行为就会被触发,甚至是懒惰的。使用-verbose可能有助于识别违规容器。 Bug report STS-3692表明该问题难以用任何普遍性来解决。

仅供参考,ImageJ也有一个类似的问题,需要使用专用的headless mode;对于example,可能有类似的gradle方法,但我没有尝试过。

+1

谢谢你的回答! – dinfuehr