在gradle.taskGraph.whenReady中设置systemProperty

时间:2014-12-04 15:35:09

标签: java groovy gradle

我正在尝试读取登录我的应用程序所需的用户名和密码,并将其分配给系统属性。我能够使用System.console().readLine读取值,但我无法将其分配给系统属性。属性值总是为null,我知道它为null,因为我在两个属性上做了System.console().println

我使用gradle.taskGraph.whenReady的原因是因为我不希望每个任务都要求输入密码,而只是在运行Live的任务时。

以下是我的代码

def user_login =""
def pass_login =""

gradle.taskGraph.whenReady { taskGraph ->
    user_login = System.console().readLine("\nPlease enter username: ")
    pass_login = System.console().readPassword("\nPlease enter password: ")

    test {
        systemProperty "username", new String(user_login)
        systemProperty "password", new String(pass_login)    
    }
}

我在没有test{...}的情况下尝试过,但是会出现以下错误消息:

Could not find method systemProperty() for arguments [username,] on root project

我在google上搜索了很多但是没有找到这个问题的答案,对此非常感谢。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以致电System.setProperty()

我不认为在groovy或gradle上存在一个名为systemProperty的方法

编辑: 您的应用程序和gradle脚本不在同一JVM实例中运行。这意味着在gradle脚本中设置的系统属性不会传递给应用程序。您需要找到另一种方法来获取应用程序中的用户名和密码。

答案 1 :(得分:0)

根据我在最新的gradle文档中看到的内容,Test有一个systemProperties属性,需要Map。没有systemProperty。因此,我相信您需要以下内容(未经测试...请参阅下面的#2):

def user_login =""
def pass_login =""

gradle.taskGraph.whenReady { taskGraph ->
    user_login = System.console().readLine("\nPlease enter username: ")
    pass_login = System.console().readPassword("\nPlease enter password: ")

    test {
        systemProperties "username": user_login, "password": pass_login    
    }
}  

我还想补充一点,我发现您的方法存在一些问题,您可能需要重新考虑。

  1. gradle 是一个构建工具/平台,构建旨在需要最少量的人工干预。这不是自动化的吗?输入您的用户名和密码将变得非常烦人,非常快。我相信你应该考虑使用gradle properties。这样构建用户就可以在用户gradle.properties文件中设置用户名和密码。这具有额外的好处,可以在不需要提示用户的情况下用于多个构建。
  2. 为什么会在taskGraph关闭时发生这种情况?这取决于taskGraph正在设置?构建中的其他任务如何使用此功能?我不相信你的代码会起作用。 test任务由您使用的任何插件提供,已在taskGraph准备就绪时配置。 Google gradle configuration vs execution可以就此主题进行大量讨论,或使用此example
  3. 考虑使用:

    /**
     * ~/.gradle/gradle.properties
     */
    userName = me
    userPassword = YouWillNeverKnow
    
    /**
     * build.gradle
     */
    apply plugin: 'java'
    test {
            // use safe navigation to avoid missing property exception
            systemProperties "username": project?.userName, "password": project?.userPassword
        }
    }  
    

    我测试了上面的内容,使用我的spock单元测试我的groovy项目并且它有效。