2015-10-20 48 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