2012-07-27 24 views
68

Tôi đang cố chuyển một đối số từ dòng lệnh tới 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 có nghĩa là cho JavaExec?). Đây là những gì tôi đã cố gắng:Làm thế nào để chuyển đối số từ dòng lệnh đến gradle

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

Sản lượng từ giá trị args trên cứng mã hoá 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à vượt qua "giới thiệu" như một Lập luận trên dòng lệnh, tôi nhận được một 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 đề.

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

args group 

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

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

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

Trả lời

41

project.group là thuộc tính được xác định trước. Với -P, bạn chỉ có thể đặt thuộc tính dự án là không phải là đượ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 đã cho tôi biết! Thay đổi tên thành testngGroup đã khắc phục đượ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 http://gradle.org/docs/current/userguide/writing_build_scripts.html. – Lidia

+0

Chỉ cần cập nhật liên kết: https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties – Kikiwa

43

Xây dựng dựa trên câu trả lời của Peter N, đây là ví dụ về cách thêm (tùy chọn) đối số do người dùng chỉ định để chuyển sang Java chính cho 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 ông trích dẫn)

Thêm phần này vào nhiệm vụ:.

task(runProgram, type: JavaExec) { 

    [...] 

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

... và chạy tại dòng lệnh như

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

Tôi làm cách nào để 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ẽ như thế nào? – Tomas

+0

@Tomas Tôi khuyên bạn nên đưa ra 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 đủ để cung cấp cho một câu trả lời nội tuyến nhanh chóng ở đây bản thân mình, anyway.) –

+1

Đừng lo lắng, đã làm nó đã và đã được sắp xếp ra ở đây [http://stackoverflow.com/questions/34875637/how -to-pass-nhiều tham số-in-command-line-khi-chạy-gradle-task) – Tomas

21

chương trình của tôi này 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]); 

build.gradle tôi

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

nhắc terminal của tôi:

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

vượt qua một url từ dòng lệnh giữ url của bạn trong ứng dụng tập tin gradle như sau resValue "chuỗi" , "url", CommonUrl

và cho một pa rameter in gradle.thuộc tính tập tin như sau CommonUrl = "đặt url của bạn ở đây hoặc có thể trống rỗng"

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

0

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

Để vượt qua các đối số từ dòng lệnh bạn chạy này:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"  
Các vấn đề liên quan