49

スタック オーバーフローの例を使用して、コンソールでパスワードの入力を求めるように gradle ビルドを取得しようとしています

次のようなステートメントがある場合:

def password = System.console().readLine("Enter keystore password ")

実行するとエラーが発生します

Cannot invoke method readLine() on null object

としてコンソールが出てくるようnullです。私がこれを読んだことには、Java 6 が必要です。これをコマンド プロンプトに移動して入力すると、java -versionJava(TM) SE ランタイム環境 (ビルド 1.6.0_27-b07) を実行しています。

この問題は Gradle の Github リポジトリで追跡されています: Can't use System.console() with the Gradle Daemon .

4

10 に答える 10

21

https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-filesで解決策を見つけ、少し修正しました。それにもかかわらず、すべてのクレジットは Tim Roes に送られます!

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
    }
}

一部のgradleファイルのどこかに、リリース署名の構成が定義されています。

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

...
}

(忘れないでくださいimport groovy.swing.SwingBuilder。)

2番目の部分については、Gradleを使用してリリース署名されたapkファイルを作成する方法もご覧ください。

于 2014-06-23T07:56:34.130 に答える
16

わかりました、これがうまくいかなかった理由はばかげていましたが、他の誰かがそれに出くわした場合に備えて、私は投稿したいと思いました.

私は android studio を介してタスクを実行していましたが、コンソール オブジェクトが常に null になることに気付きませんでした。コマンド ラインから実行する場合、「コマンド」オブジェクトは null ではなく、正常に動作します。

于 2013-10-24T06:11:08.730 に答える
7

この問題を回避するために、次のように標準入力ストリームを使用しました。

println "Enter keystore password"
def password = System.in.newReader().readLine()
于 2018-04-05T16:43:29.073 に答える
3

次の方法でもスクリプトを実行できます。

-Dorg.gradle.daemon=false

于 2016-12-23T11:41:24.740 に答える
2

これに対する簡単な解決策は、コンソール オブジェクトの null をチェックすることです。

def password = null
def console = System.console()
if (console != null) {
    password = console.readLine("Enter keystore password: ")
}

Android Studio は、null object.

型付き文字を非表示にするreadPassword()には、代わりにreadLine()次を使用します。

password = new String(console.readPassword("\nEnter key password: "))
于 2014-03-10T22:19:35.723 に答える