【问题标题】:Failed to create component for 'dialog' reason: java.awt.HeadlessException由于“对话框”原因无法创建组件:java.awt.HeadlessException
【发布时间】:2017-08-27 20:54:25
【问题描述】:

将 gradle 更新到版本 3.0.0-beta3 后,当我尝试显示一个对话框以询问密钥的密码时出现此错误。

我尝试添加System.setProperty('java.awt.headless', 'false'),但没有成功,我在 google 上没有发现任何新内容....

错误:(20, 1) 由于“对话”原因无法创建组件: 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
}

【问题讨论】:

  • 相关问题:github.com/gradle/gradle/issues/2826,已关闭,因为记者无法再在 Gradle 3.3 上重现,但它很可能会在 4.0 中恢复。
  • 停止 Gradle 守护进程对我有帮助,“./gradlew --stop”。

标签: android gradle android-gradle-plugin


【解决方案1】:

只需在import groovy.swing.SwingBuilder 之前添加System.setProperty('java.awt.headless', 'false') 并使用./gradlew --stop 杀死gradle deamon

它会给你一些类似的东西:

apply plugin: 'com.android.application'

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

import groovy.swing.SwingBuilder

【讨论】:

  • 添加之前 - 在哪里?
  • @StAlex before "import groovy.swing.SwingBuilder"
  • 此解决方案是否仍然适合您?我无法让它与 'com.android.tools.build:gradle:3.0.1' 完全一样,正如您在 github.com/CUTR-at-USF/onebusaway-android/tree/… 上使用 gradlew assembleObaGoogleRelease 时所写的那样
  • 在创建 SwingBuilder 对象之前添加这个 System.setProperty('java.awt.headless', 'false') (在 if (System.console() == null) 之后)。它对我有用
  • 谢谢青,只有那个对我有用,在构建文件的顶部声明它不是。
【解决方案2】:

要解决这个问题,你必须完全按照这个顺序添加这 3 行(其他顺序不起作用)

apply plugin: 'com.android.application'

import groovy.swing.SwingBuilder

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

【讨论】:

  • 我的解决方案确实有效。我每天都用它!
  • 不,直到您完全按照我的方式编辑答案。不幸的是,stackoverflow 允许我们看到您之前的答案。
  • 和我写的一模一样。我只是用和你一样的方式写的。可以看一下代码和我之前写的是否一致,行序不一样。
【解决方案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

【讨论】:

    【解决方案4】:

    对我来说,当我两次添加System.setProperty('java.awt.headless', 'false') 时,它终于奏效了:

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

    但是只有在System.console() == null检查之后才可以。

    如前所述,别忘了./gradlew --stop

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多