Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle build null console object

I'm trying to get my gradle builds to prompt at the console for a password using examples from stack overflow

When I have a statment such as:

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

When I run I get the error

Cannot invoke method readLine() on null object

It seems console is coming out as null. What I've read this requires java 6 which if I go to a command prompt and type java -version I'm running Java(TM) SE Runtime Environment (build 1.6.0_27-b07).

This issue is being tracked in Gradle's Github repo: Can't use System.console() with the Gradle Daemon.

like image 794
Andrew Avatar asked Oct 21 '13 06:10

Andrew


3 Answers

For some reason, running gradle in daemon mode causes a null console object. If you specify the appropriate command line flag,

./gradlew assembleRelease --no-daemon

it'll work.

like image 132
nucleartide Avatar answered Oct 03 '22 13:10

nucleartide


I found a solution here at https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files and slightly modified it. Nevertheless, all credits go to 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     } } 

Somewhere in the some gradle file, you have the configuration for the release signing defined.

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

(Don't forget to import groovy.swing.SwingBuilder.)

Regarding the second part, you may also have a look at How to create a release signed apk file using Gradle?

like image 40
Martin L. Avatar answered Oct 03 '22 13:10

Martin L.


Ok, the reason why this didn't work was silly, but just in case anyone else comes across it I thought I'd post.

I was running the task through android studio and didn't realise that the console object would always be null. When running from the command line the "command" object isn't null and it works ok.

like image 36
Andrew Avatar answered Oct 03 '22 13:10

Andrew