我有一个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
,但这对我没有任何影响。
答案 0 :(得分:3)
如果添加以下命令行选项:
-Djava.awt.headless=true
到脚本中的java
命令行,然后AWT不会尝试自己初始化,并且不会显示菜单元素,如菜单栏。
答案 1 :(得分:2)
这可能吗?
如Using Headless Mode in the Java SE Platform中所述,某些“重量级组件需要操作系统级别的对等方”。 Mac OS X通过添加可以根据建议application menu和here修改的最小here条目,将包含此类组件的应用程序集成到桌面环境中。当这样的重量级组件被实例化时,即使是懒惰,也会触发该行为。使用-verbose
可能有助于识别违规容器。错误报告STS-3692
表明这个问题很难解决。
作为参考,ImageJ
有类似的问题,需要使用headless mode中适用的特殊headless.jar
;对于example,可能有类似的gradle方法,但我没有尝试过。