无法创建 'dialog' 组件,原因:java.awt.HeadlessException。

13

将gradle更新到版本3.0.0-beta3后,尝试显示对话框以请求密钥密码时,我遇到了此错误。

我尝试添加System.setProperty('java.awt.headless', 'false')但它没有起作用,并且在谷歌上没有找到任何很新的东西....

错误:(20,1)无法为'dialog'创建组件原因:java.awt.HeadlessException

java.awt.HeadlessException(没有错误消息)

import groovy.swing.SwingBuilder

gradle.taskGraph.whenReady { taskGraph ->
        def storePassword = ''
        def keyPassword = ''
        if (System.console() == null) {
            new SwingBuilder().edt {
                dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) {
                    vbox {
                        label(text: "Please enter store passphrase:")
                        def input1 = passwordField()
                        label(text: "Please enter key passphrase:")
                        def input2 = passwordField()
                        button(defaultButton: true, text: 'OK', actionPerformed: {
                            storePassword = input1.password;
                            keyPassword = input2.password;
                            dispose();
                        })
                    }
                }
            }
        } else {
            storePassword = System.console().readPassword("\nPlease enter store passphrase: ")
            keyPassword = System.console().readPassword("\nPlease enter key passphrase: ")
        }

        if (storePassword.size() <= 0 || keyPassword.size() <= 0) {
            throw new InvalidUserDataException("You must enter the passwords to proceed.")
        }

        storePassword = new String(storePassword)
        keyPassword = new String(keyPassword)

        android.signingConfigs.Keys.storePassword = storePassword
        android.signingConfigs.Keys.keyPassword = keyPassword
}

相关问题:https://github.com/gradle/gradle/issues/2826,已关闭,因为报告者无法在Gradle 3.3上再现,但它很可能会在4.0中重新出现。 - Pierre-Luc Paour
只需要停止Gradle守护进程就可以了,"./gradlew --stop"。 - Adhikari Bishwash
5个回答

12

import groovy.swing.SwingBuilder 之前添加 System.setProperty('java.awt.headless', 'false') 并使用 ./gradlew --stop 命令停止 gradle 守护进程,这样可以得到类似于以下的结果:

apply plugin: 'com.android.application'

System.setProperty('java.awt.headless', 'false')

import groovy.swing.SwingBuilder

添加在哪里前面? - A. Petrov
@StAlex 在“import groovy.swing.SwingBuilder”之前。 - filol
1
这个解决方案对您仍然管用吗? 当我在 https://github.com/CUTR-at-USF/onebusaway-android/tree/release-builds-broken 上使用 gradlew assembleObaGoogleRelease 时,我无法像您编写的那样使用 'com.android.tools.build: gradle: 3.0.1' - Sean Barbeau
3
在创建 SwingBuilder 对象之前(if (System.console() == null) 之后),添加 System.setProperty('java.awt.headless', 'false') 这行代码。这对我有用。 - Qing
1
谢谢 Qing,只有那个对我起作用了,在构建文件的顶部声明它是不行的。 - Szörényi Ádám
太好了。这解决了从Cordova/Android 5到7迁移时遇到的最后一串问题。我添加到build-extras.gradle,效果很棒。 - RamblinRose

3
为了解决这个问题,您需要按照以下顺序添加这3行代码(其他顺序无效)。
apply plugin: 'com.android.application'

import groovy.swing.SwingBuilder

System.setProperty('java.awt.headless', 'false')

1
工作示例在这里:https://github.com/filol/MyApplication/blob/master/app/build.gradle - Sergio Lissner
我的解决方案实际上是可行的。我每天都使用它! - filol
1
不,直到你完全按照我的答案进行编辑之前,我才看到它。不幸的是,stackoverflow允许我们查看你之前的回答。 - Sergio Lissner
1
这与我写的完全相同。我只是以你的方式写了出来。你可以看一下代码是否与我之前写的匹配,但行的顺序可能不同。 - filol

3
def doPromptForPassword(msg) {
if (System.console() == null) {
    System.setProperty('java.awt.headless', 'false') // worked for me
    def ret = null
    new SwingBuilder().edt {
        dialog(modal: true, title: 'Enter password', alwaysOnTop: t

1

当我两次添加 System.setProperty('java.awt.headless', 'false') 后,终于解决了问题:

  • 在导入后立即添加
  • System.console() == null 检查后添加

但是只在System.console() == null 检查后添加也可以正常工作。

别忘了像之前提到的那样运行 ./gradlew --stop


1

在构建我的Ionic-Cordova应用程序的发布版本时,我遇到了这个错误。 我所做的就是在我的项目根目录中的build.json文件中分配“storePassword”。

build.json

{
    "android": {
        "debug": {
            "keystore": "./my-release-key.keystore",
            "storePassword": "password",
            "alias": "name",
            "password" : "password",
            "keystoreType": "",
            "packageType": "apk"
        },
        "release": {
            "keystore": "./my-release-key.keystore",
            "storePassword": "password",
            "alias": "name",
            "password" : "password",
            "keystoreType": "",
            "packageType": "apk"
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接