Java 在gradle.taskGraph.whenReady中设置系统属性

Java 在gradle.taskGraph.whenReady中设置系统属性,java,groovy,gradle,Java,Groovy,Gradle,我正在尝试读取登录到我的应用程序并将其分配给系统属性所需的用户名和密码。我可以使用System.console().readLine读取值,但无法将其分配给系统属性。属性值总是空的,我知道它是空的,就像我在两个属性上做的System.console().println一样 我之所以使用gradle.taskGraph.whenReady是因为我不希望每个任务都要求输入密码,而只希望在运行针对Live的任务时输入密码 下面是我的代码 def user_login ="" def pass_logi

我正在尝试读取登录到我的应用程序并将其分配给系统属性所需的用户名和密码。我可以使用
System.console().readLine
读取值,但无法将其分配给系统属性。属性值总是空的,我知道它是空的,就像我在两个属性上做的
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
我在谷歌上搜索了很多,但没有找到这个问题的答案,对此我非常感谢


谢谢。

您只需调用
System.setProperty()

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

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

从我在最新的gradle文档中看到,有一个
systemProperties
属性,它采用
映射。没有
systemProperty
。因此,我相信您需要以下内容(未经测试…请参见下文第2部分):

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

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

    /**
     * ~/.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项目进行了上述测试,结果成功了。

    System.setProperty(“用户名”,新字符串(用户登录))
    感谢@stav saad,它似乎在gradle脚本中工作,但在将用户名/密码传递给应用程序的测试框架中似乎无法访问。我在其他任务中使用systemProperty为用户名密码为静态且有效的环境设置用户名和密码,但不是从这段代码。任何想法??测试块仅在任务中可用。您使用的闭包中没有定义它,因此它不起作用。您是如何打印属性值的?另外,
    System.console
    不能用于Gradle构建脚本,至少在与Gradle守护程序一起运行时不能。我不认为分配是问题。使用
    systemProperties
    对我也不起作用,当我使用
    System.println(“用户名:”+System.getProperty(“用户名”))
    test{…}
    块之外时,它在控制台上打印空值。我在另一个命名的任务中使用了
    systemProperty
    (smokeOnLive,type:Test,dependsOn:['clean'],description:“运行冒烟测试”,group:“smoke”)
    像这样
    systemProperty“webdriver.type”,System.getProperty(“webdriver.type”)
    并且它工作正常,没有任何问题,只有当我尝试在TaskGraph中使用它时,我才会收到错误消息。要回答您的问题,请参见1。我使用这些脚本在Live和Release候选上运行冒烟测试,在Live上运行需要输入我们的凭据,根据安全策略,我们不能将其存储在任何地方。它是一个小的测试套件,只运行大约10分钟,在我们发布软件时每2周运行一次。2.我在TaskGraph中这样做是因为我希望只有在现场运行冒烟测试时才会询问,而不是在候选发布环境中运行冒烟测试时。
    /**
     * ~/.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
        }
    }