Gradle构建空控制台对象

And*_*rew 42 gradle build.gradle android-gradle-plugin

我正在尝试让我的gradle构建使用堆栈溢出中的示例在控制台提示输入密码

当我有一个例如:

def password = System.console().readLine("Enter keystore password ")
Run Code Online (Sandbox Code Playgroud)

当我跑步时,我得到了错误

Cannot invoke method readLine() on null object
Run Code Online (Sandbox Code Playgroud)

似乎控制台出现了null.我读过这个需要java 6,如果我进入命令提示符并键入java -version我正在运行Java(TM)SE运行时环境(版本1.6.0_27-b07).

在Gradle的Github存储库中正在跟踪此问题:无法使用带有Gradle守护程序的System.console().

Jas*_* Tu 45

出于某种原因,在守护进程模式下运行gradle会导致空控制台对象.如果指定适当的命令行标志,

./gradlew assembleRelease --no-daemon

它会工作的.

  • 大声笑,这是一个项目,但不是另一个. (3认同)
  • 使用 gradle 4.2 不起作用 > 无法在 null 对象上调用方法 readPassword() (3认同)

Mar*_* L. 20

我在https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files找到了一个解决方案,稍作修改.然而,所有的积分都归蒂姆罗斯!

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

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

    storePass = new String(storePass)
    keyPass = new String(keyPass)

    android.signingConfigs.release.storePassword = storePass
    android.signingConfigs.release.keyPassword = keyPass
    }
}
Run Code Online (Sandbox Code Playgroud)

在某个gradle文件中的某个位置,您可以定义发布签名的配置.

android {
...
signingConfigs {
    ...
    release {
        storeFile file(System.getProperty("user.home")+"\\android-key")
        storePassword ''
        keyAlias "standard"
        keyPassword ''
    }
}

...
}
Run Code Online (Sandbox Code Playgroud)

(别忘了import groovy.swing.SwingBuilder.)

关于第二部分,您还可以看看如何使用Gradle创建一个发布的签名apk文件?

  • 非常好的生产就绪修改,谢谢.别忘了`import groovy.swing.SwingBuilder` (6认同)

And*_*rew 16

好吧,之所以不起作用的原因是愚蠢的,但万一其他人遇到它,我以为我会发帖.

我通过android studio运行任务,并没有意识到控制台对象总是为空.从命令行运行时,"command"对象不为null,它可以正常工作.

  • 从两个地方运行时,您是否找到了解决方法来使其工作? (9认同)
  • 就我而言,即使通过终端运行,该对象也为空。我不想通过 AS 运行。 (3认同)

alb*_*iff 9

当属性出现时,System.getConsole()Gradle执行,或者从IntelliJAndroid Studio等IDE执行时,它返回.因此,例如,变得不可能.org.gradle.daemontruenullSystem.console().readLine()

此外,默认情况下,Gradle 3.0 gradle.daemon开始.

然后System.getConsole()使用ant.input类似的方法代替使用我的替代方法的变通方法:

task avoidNullOnConsole << {
    ant.input(message: 'Enter keystore password:', addproperty: 'userInputPassword', defaultValue : '1234')
    def password = ant.properties.userInputPassword
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,ant.input显示message并添加用户输入ant.properties作为属性名称使用中定义的值addProperty.如果没有用户输入,则default使用属性中定义的值.

一旦执行,您可以使用ant.properties.yourProperty或获取用户输入ant.properties['yourProperty'].

您可以在ant.input此处检查其余属性.

注意:如果要ant.input多次使用,请考虑到无法覆盖和现有属性,因此addProperty每个属性必须不同.


Mic*_*any 7

请查看此博客文章(https://www.timroes.de/2013/09/22/handling-signing-configs-with-gradle/).

它描述了处理签名配置的多种方法,其中之一就是关于密码的控制台输入的问题.


Nic*_*tto 5

要解决此问题,我将标准输入流用作下一个:

println "Enter keystore password"
def password = System.in.newReader().readLine()
Run Code Online (Sandbox Code Playgroud)