Nhiệm vụ cấp - truyền đối số cho ứng dụng Java


127

Tôi có một ứng dụng Java chạy với tác vụ lớp tùy chỉnh và ứng dụng yêu cầu một số đối số khi được gọi. Đó là:

programName ( string | -f filename | -d key | -h)
Options:
    string         Message to be used.
    -d key         Use default messages, key must be s[hort], m[edium] or l[ong].
    -f filename    Use specified file as input.
    -h             Help dialog.

Nhiệm vụ cấp lớp trông như:

task run (type: JavaExec){
    description = "Secure algorythm testing"
    main = 'main.Test'
    classpath = sourceSets.main.runtimeClasspath
}

Tôi đã thử chạy gradle run -hvà nó không hoạt động.


Các câu trả lời có phù hợp với nhu cầu của bạn không? Nếu vậy, bạn nên đánh dấu một là giải pháp.
Francisco J. Lopez-Pellicer

1
Không thực sự ... một người bạn và tôi đã khám phá ra một cách để làm điều đó nhưng chúng tôi chưa rõ ràng để xuất bản một giải pháp, cả hai giải pháp được đề xuất đã được thử, chúng tôi hiểu những gì nó sẽ được thực hiện, nhưng đã không T thực sự có vẻ hiệu quả ...
RecuencoJones

@ 6phin6reat6od Cuối cùng bạn đã giải quyết nó như thế nào? Còn phiên bản nào của gradle?
xlm

Câu trả lời:


80

Kể từ Lớp 4.9, các đối số dòng lệnh có thể được truyền bằng --args. Ví dụ: nếu bạn muốn khởi chạy ứng dụng với các đối số dòng lệnh foo --bar, bạn có thể sử dụng

chạy lớp --args = 'foo --bar'

Xem thêm Plugin ứng dụng Gradle

Cách nâng cấp trình bao bọc Gradle


1
Là 'dự kiến ​​hay một lỗi đánh máy? Tất cả các đối số có nên được thông qua dưới dạng một chuỗi được phân tách bằng dấu ngoặc đơn không?
RecuencoJones

@RecuencoJones Đã sửa lỗi trên docs.gradle.org/civerse/userguide/iêu
Drew Stephens

1
gradle run --args = 'foo --bar'
Jim Flood

3
'foo --bar'là khó hiểu, tại sao không chỉ sử dụng 'foo bar'.
Eric Wang

4
@EricWang Đây là các đối số dòng lệnh tùy ý mà một chương trình có thể cần. Thật tuyệt khi chỉ ra rằng gradle hỗ trợ bất kỳ loại đối số nào, vì chuỗi thô được truyền cho ứng dụng được xây dựng.
Joffrey

100

Lớp 4.9+

gradle run --args='arg1 arg2'

Điều này giả định rằng bạn build.gradleđược cấu hình với plugin Ứng dụng . Bạn build.gradlesẽ trông giống như thế này:

plugins {
  // Implicitly applies Java plugin
  id: 'application'
}

application {
  // URI of your main class/application's entry point (required)
  mainClassName = 'org.gradle.sample.Main'
}

Lớp trước 4.9

Bao gồm những điều sau đây trong build.gradle:

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

Sau đó để chạy: gradle run -PappArgs="['arg1', 'args2']"


7
Câu trả lời này không chỉ hữu ích, nó đơn giản nhất.
Jossie Calderon

Cập nhật cho cập nhật của bạn: gradle run --args 'arg1 arg2'Không làm việc cho tôi. Tôi phải làm:gradle run --args='arg1 arg2'
cmyer

@cmyer cảm ơn vì đã bắt được nó! Tôi đã cập nhật bản cập nhật của mình
xlm

28

Xin lỗi vì trả lời muộn như vậy.

Tôi đã tìm ra một câu trả lời giống như của @xlm:

task run (type: JavaExec, dependsOn: classes){
    if(project.hasProperty('myargs')){
        args(myargs.split(','))
    }
    description = "Secure algorythm testing"
    main = "main.Test"
    classpath = sourceSets.main.runtimeClasspath
}

Và gọi như:

gradle run -Pmyargs=-d,s

28

Nếu bạn muốn sử dụng cùng một bộ đối số mọi lúc, sau đây là tất cả những gì bạn cần.

run {
    args = ["--myarg1", "--myarg2"]
}

2
Ok, đối với những người mới bắt đầu tuyệt đối như tôi: để có thể xác định tác vụ chạy, build.gradle của bạn phải chứa hai dòng sau: áp dụng plugin: 'application' mainClassName = "<tên lớp đầy đủ bao gồm đường dẫn gói>" Nếu không, bạn không thể xác định phương thức chạy trong buuild.gradle
mk ..

1
Tôi đang sử dụng id 'application'plugin và đây là câu trả lời tôi cần (nó hoạt động).
Big Rich

6

Bạn có thể tìm thấy giải pháp trong các Sự cố truyền các thuộc tính và tham số của hệ thống khi chạy lớp Java thông qua Gradle . Cả hai liên quan đến việc sử dụng argstài sản

Ngoài ra, bạn nên đọc sự khác biệt giữa việc chuyển với -Dhoặc với -Pđiều đó được giải thích trong tài liệu Gradle


Thấy cái này quá. Vẫn đang nhìn. Tất cả các phương pháp này dường như muốn chỉnh sửa / xoa bóp các thuộc tính hiện tại và chuyển chúng đi cùng. Dòng lệnh và thuộc tính Java để chạy ứng dụng hoặc dịch vụ gần giống với cài đặt "Ngữ cảnh" hoặc "Cấu hình". Sẽ tốt hơn nếu có một trình cắm thêm thực hiện những việc như "chạy tham số" dưới dạng cấu hình cạnh nhau hoặc thứ gì đó.
sẽ

5

Tất nhiên các câu trả lời trên tất cả đều thực hiện công việc, nhưng tôi vẫn muốn sử dụng một cái gì đó như

gradle run path1 path2

tốt, điều này không thể được thực hiện, nhưng nếu chúng ta có thể:

gralde run --- path1 path2

Nếu bạn nghĩ rằng nó thanh lịch hơn, thì bạn có thể làm điều đó, mẹo là xử lý dòng lệnh và sửa đổi nó trước khi phân lớp, điều này có thể được thực hiện bằng cách sử dụng init script

Kịch bản init bên dưới:

  1. Xử lý dòng lệnh và xóa --- và tất cả các đối số khác theo sau '---'
  2. Thêm thuộc tính 'appArss' vào gradle.ext

Vì vậy, trong tác vụ chạy của bạn (hoặc JavaExec, Exec), bạn có thể:

if (project.gradle.hasProperty("appArgs")) {
                List<String> appArgs = project.gradle.appArgs;

                args appArgs

 }

Kịch bản init là:

import org.gradle.api.invocation.Gradle

Gradle aGradle = gradle

StartParameter startParameter = aGradle.startParameter

List tasks = startParameter.getTaskRequests();

List<String> appArgs = new ArrayList<>()

tasks.forEach {
   List<String> args = it.getArgs();


   Iterator<String> argsI = args.iterator();

   while (argsI.hasNext()) {

      String arg = argsI.next();

      // remove '---' and all that follow
      if (arg == "---") {
         argsI.remove();

         while (argsI.hasNext()) {

            arg = argsI.next();

            // and add it to appArgs
            appArgs.add(arg);

            argsI.remove();

        }
    }
}

}


   aGradle.ext.appArgs = appArgs

Hạn chế:

  1. Tôi đã buộc phải sử dụng '---' chứ không phải '-'
  2. Bạn phải thêm một số tập lệnh init toàn cầu

Nếu bạn không thích tập lệnh init toàn cầu, bạn có thể chỉ định nó trong dòng lệnh

gradle -I init.gradle run --- f:/temp/x.xml

Hoặc tốt hơn là thêm một bí danh vào vỏ của bạn:

gradleapp run --- f:/temp/x.xml

2
Điều này hoạt động rất tốt ... nếu không có đối số nào của tôi bắt đầu bằng dấu gạch ngang. Điều này làm cho nó trở nên vô dụng đối với các trình phân tích cú pháp dòng lệnh phổ biến :(. Ngay khi điều đó xảy ra, gradle dường như coi đối số đó là một đối số để phân lớp (Tôi không nghĩ rằng argsI.remove()nó có hiệu quả mong muốn). Gợi ý?
Kreas

3

Bạn cần chuyển chúng argscho nhiệm vụ bằng cách sử dụng các thuộc tính của dự án, đại loại như:

args = [project.property('h')]

được thêm vào định nghĩa nhiệm vụ của bạn (xem tài liệu dsl )

Sau đó, bạn có thể chạy nó như:

gradle -Ph run
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.