Cách chuyển các đối số từ dòng lệnh sang gradle


104

Tôi đang cố chuyển một đối số từ dòng lệnh sang một lớp java. Tôi đã theo dõi bài đăng này: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html nhưng mã không hoạt động đối với tôi (có lẽ nó không dành cho JavaExec?). Đây là những gì tôi đã thử:

task listTests(type:JavaExec){
    main = "util.TestGroupScanner"
    classpath = sourceSets.util.runtimeClasspath
    // this works...
    args 'demo'
    /*
    // this does not work!
    if (project.hasProperty("group")){
        args group
    }
    */
}

Đầu ra từ giá trị args được mã hóa cứng ở trên là:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests
:compileUtilJava UP-TO-DATE
:processUtilResources UP-TO-DATE
:utilClasses UP-TO-DATE
:listTests
Received argument: demo

BUILD SUCCESSFUL

Total time: 13.422 secs

Tuy nhiên, khi tôi thay đổi mã để sử dụng phần hasProperty và chuyển "demo" làm đối số trên dòng lệnh, tôi nhận được NullPointerException:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests -Pgroup=demo -s

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle\build.gradle' line:25

* What went wrong:
A problem occurred evaluating root project 'testgradle'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project
 'testgradle'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:54)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:127)
    at org.gradle.configuration.BuildScriptProcessor.evaluate(BuildScriptProcessor.java:38) 

Có một dự án thử nghiệm đơn giản có sẵn tại http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip minh họa vấn đề này.

Điều này đang sử dụng Gradle 1.0-rc-3. NullPointer là từ dòng mã này:

args group 

Tôi đã thêm nhiệm vụ sau trước định nghĩa nhiệm vụ, nhưng nó không thay đổi kết quả:

group = hasProperty('group') ? group : 'nosuchgroup' 

Bất kỳ gợi ý nào về cách chuyển đối số dòng lệnh sang gradle đều được đánh giá cao.


TNX rất nhiều @Joshua Goldberg. mẫu cho một đối số: stackoverflow.com/a/58202665/2201814
MHSFisher

Câu trả lời:


62

project.grouplà tài sản được xác định trước. Với -P, bạn chỉ có thể đặt các thuộc tính của dự án không được xác định trước. Ngoài ra, bạn có thể đặt thuộc tính hệ thống Java ( -D).


3
Cảm ơn vì đã cho tôi biết! Thay đổi tên thành testngGroup đã khắc phục sự cố. Tìm thấy danh sách các thuộc tính được xác định trước trong bảng 13.1 tại gradle.org/docs/current/userguide/writing_build_scripts.html .
Lidia,

2
Chỉ cần cập nhật liên kết: docs.gradle.org/current/userguide/…
Kikiwa

56

Dựa trên câu trả lời của Peter N, đây là một ví dụ về cách thêm (tùy chọn) đối số do người dùng chỉ định để chuyển đến Java main cho một tác vụ JavaExec (vì bạn không thể đặt thuộc tính 'args' theo cách thủ công vì lý do anh ta trích dẫn.)

Thêm điều này vào nhiệm vụ:

task(runProgram, type: JavaExec) {

  [...]

  if (project.hasProperty('myargs')) {
      args(myargs.split(','))
  }

... và chạy ở dòng lệnh như thế này

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt'

2
Làm thế nào tôi có thể bắt đầu có các tham số riêng biệt? Ví dụ: gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' mã của tôi trong build.gradle sẽ trông như thế nào?
Tomas

@Tomas Tôi khuyên bạn nên bổ sung một câu hỏi cấp cao nhất cho điều đó. (Tôi không biết rằng tình hình cũng đủ để đưa ra một câu trả lời inline nhanh chóng ở đây bản thân mình, dù sao.)
Joshua Goldberg

1
Đừng lo, đã làm nó rồi và được sắp xếp ở đây
Tomas

28

Chương trình của tôi với hai đối số, args [0] và args [1]:

public static void main(String[] args) throws Exception {
    System.out.println(args);
    String host = args[0];
    System.out.println(host);
    int port = Integer.parseInt(args[1]);

xây dựng của tôi.gradle

run {
    if ( project.hasProperty("appArgsWhatEverIWant") ) {
        args Eval.me(appArgsWhatEverIWant)
    }
}

dấu nhắc đầu cuối của tôi:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"

17

Kể từ Gradle 4.9, plugin ứng dụng hiểu --argstùy chọn, vì vậy việc chuyển các đối số đơn giản như:

build.gradle

plugins {
    id 'application'
}

mainClassName = "my.App"

src / main / java / my / App.java

public class App {
    public static void main(String[] args) {
        System.out.println(args);
    }
}

bấu víu

./gradlew run --args='This string will be passed into my.App#main arguments'

15

Có thể sử dụng các tùy chọn dòng lệnh tùy chỉnh trong Gradle để kết thúc với một cái gì đó như:

./gradlew printPet --pet="puppies!"

Tuy nhiên, các tùy chọn dòng lệnh tùy chỉnh trong Gradle là một tính năng ươm tạo .

Giải pháp Java

Để kết thúc với một cái gì đó như thế này, hãy làm theo hướng dẫn tại đây :

import org.gradle.api.tasks.options.Option;

public class PrintPet extends DefaultTask {
    private String pet;

    @Option(option = "pet", description = "Name of the cute pet you would like to print out!")
    public void setPet(String pet) {
        this.pet = pet;
    }

    @Input
    public String getPet() {
        return pet;
    }

    @TaskAction
    public void print() {
        getLogger().quiet("'{}' are awesome!", pet);
    }
}

Sau đó đăng ký nó:

task printPet(type: PrintPet)

Bây giờ bạn có thể làm:

./gradlew printPet --pet="puppies"

đầu ra:

Chó con! là tuyệt vời!

Giải pháp Kotlin

open class PrintPet : DefaultTask() {

    @Suppress("UnstableApiUsage")
    @set:Option(option = "pet", description = "The cute pet you would like to print out")
    @get:Input
    var pet: String = ""

    @TaskAction
    fun print() {    
        println("$pet are awesome!")
    }
}

sau đó đăng ký nhiệm vụ với:

tasks.register<PrintPet>("printPet")

5

Nếu bạn cần kiểm tra và đặt một đối số , build.gradletệp của bạn sẽ giống như sau:

....

def coverageThreshold = 0.15

if (project.hasProperty('threshold')) {
    coverageThreshold = project.property('threshold').toString().toBigDecimal()
}

//print the value of variable
println("Coverage Threshold: $coverageThreshold")
...

Và lệnh Mẫu trong cửa sổ:

thử nghiệm sạch gradlew -Pthreshold = 0,25


4

Tôi đã viết một đoạn mã đặt các đối số dòng lệnh ở định dạng mà gradle mong đợi.

// this method creates a command line arguments
def setCommandLineArguments(commandLineArgs) {
    // remove spaces 
    def arguments = commandLineArgs.tokenize()

            // create a string that can be used by Eval 
            def cla = "["
            // go through the list to get each argument
            arguments.each {
                    cla += "'" + "${it}" + "',"
            }

    // remove last "," add "]" and set the args 
    return cla.substring(0, cla.lastIndexOf(',')) + "]"
}

nhiệm vụ của tôi trông như thế này:

task runProgram(type: JavaExec) {
    if ( project.hasProperty("commandLineArgs") ) {
            args Eval.me( setCommandLineArguments(commandLineArgs) )
    }
}

Để chuyển các đối số từ dòng lệnh, bạn chạy điều này:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    

0

Có một ví dụ tuyệt vời ở đây:

https://kb.novaordis.com/index.php/Gradle_Pass_Configuration_on_Command_Line

Những chi tiết nào bạn có thể chuyển các tham số và sau đó cung cấp giá trị mặc định trong một biến ext như sau:

gradle -Dmy_app.color=blue

và sau đó tham chiếu trong Gradle dưới dạng:

ext {
   color = System.getProperty("my_app.color", "red");
}

Và sau đó ở bất kỳ đâu trong tập lệnh xây dựng của bạn, bạn có thể tham chiếu nó như một khóa học ở bất kỳ đâu bạn có thể tham khảo nó như project.ext.color

Các mẹo khác tại đây: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties


-4

chuyển một url từ dòng lệnh giữ url của bạn trong tệp gradle ứng dụng như sau resValue "string", "url", CommonUrl

và đưa ra một tham số trong tệp gradle.properties như sau CommonUrl = "đặt url của bạn ở đây hoặc có thể để trống"

và chuyển một lệnh đến từ dòng lệnh như sau gradle assemblyRelease -Pcommanurl = đặt URL của bạn ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.