Gradle để thực thi lớp Java (mà không cần sửa đổi build.gradle)


119

một plugin Eclipse đơn giản để chạy Gradle, chỉ sử dụng cách dòng lệnh để khởi chạy gradle.

Tương tự gradle để biên dịch và chạy maven là gì mvn compile exec:java -Dexec.mainClass=example.Example

Bằng cách này gradle.buildcó thể chạy bất kỳ dự án nào với .

CẬP NHẬT: Có một câu hỏi tương tự Tương đương với gradle của plugin thực thi của maven để chạy các ứng dụng Java là gì? đã hỏi trước đây, nhưng giải pháp đề xuất thay đổi mọi dự ánbuild.gradle

package runclass;

public class RunClass {
    public static void main(String[] args) {
        System.out.println("app is running!");
    }
}

Sau đó thực hiện gradle run -DmainClass=runclass.RunClass

:run FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> No main class specified   

Trùng lặp có thể xảy ra của stackoverflow.com/questions/16350757/...
Teresa Carrigan

Sử dụng lệnh: chạy gradle
a_subscriber

Câu trả lời:


138

Không có tương đương trực tiếp với mvn exec:javatrong gradle, bạn cần phải áp dụng applicationplugin hoặc có một JavaExecnhiệm vụ.

application cắm vào

Kích hoạt plugin:

plugins {
    id 'application'
    ...
}

Định cấu hình nó như sau:

application {
    mainClassName = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
}

Trên dòng lệnh, viết

$ gradle -PmainClass=Boo run

JavaExec bài tập

Xác định một nhiệm vụ, giả sử execute:

task execute(type:JavaExec) {
   main = project.hasProperty("mainClass") ? getProperty("mainClass") : "NULL"
   classpath = sourceSets.main.runtimeClasspath
}

Để chạy, hãy viết gradle -PmainClass=Boo execute. Bạn lấy

$ gradle -PmainClass=Boo execute
:compileJava
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes
:execute
I am BOO!

mainClasslà một thuộc tính được truyền động tại dòng lệnh. classpathđược thiết lập để đón các lớp mới nhất.


Nếu bạn không vượt qua thuộc mainClasstính, cả hai cách tiếp cận đều không như mong đợi.

$ gradle execute

FAILURE: Build failed with an exception.

* Where:
Build file 'xxxx/build.gradle' line: 4

* What went wrong:
A problem occurred evaluating root project 'Foo'.
> Could not find property 'mainClass' on task ':execute'.

1
Bạn phải sửa đổi build.gradle, classpathđược mã hóa cứng để chọn các lớp java từ classpath nguồn build.gradle java của bạn . Ngay cả khi bạn chạy mvn exec:javaclasspath được thiết lập để lấy các tệp nguồn java trong thư mục maven hiện tại. Trong JavaExecnhiệm vụ, tôi cũng đã làm như vậy. Thay đổi nguồn javaclasspath của bạn và đường dẫn lớp sẽ tự động thay đổi. Không có - tương đương với việc bạn cần áp dụng plugin hoặc có một nhiệm vụ. mvn exec:javagradleapplicationJavaExec
First Zero,

1
HOẶC tùy chọn khác là bạn viết plugin của riêng bạn để làm điều này và thậm chí sau đó bạn phải thay đổi build.gradle để chọn plugin của mình.
First Zero

3
Tôi vừa thử điều này và có vẻ như sau khi thêm task execute(...vào build.gradle, mọi tác vụ khác đều không thành công với cùng một thông báo lỗi cho biết rằng gradle mong đợi mainClass được chuyển đi. Tôi không thể làm sạch hoặc xây dựng.
Nirro

4
@Nirei Thay thế main = mainClassbằng main = getProperty("mainClass")và nó sẽ không còn la mắng bạn nữa.
Adi Gerber

2
điều này vẫn còn lỗi gradle build, hãy xem câu trả lời của tôi bên dưới.
Matt,

140

Bạn chỉ cần sử dụng plugin Gradle Application :

apply plugin:'application'
mainClassName = "org.gradle.sample.Main"

Và sau đó đơn giản gradle run.

Như Teresa đã chỉ ra, bạn cũng có thể cấu hình mainClassNamelàm thuộc tính hệ thống và chạy với đối số dòng lệnh.


2
Điều đó sẽ yêu cầu mã hóa cứng mỗi lớp như vậy vào build.graldle. Nhưng tôi có dự án với rất nhiều lớp sử dụng, mỗi lớp đều có phương thức chính.
Paul Verest

Và bạn chắc chắn 1) tên lớp đủ điều kiện là chính xác 2) bạn đặt đúng tên thuộc tính trong tệp xây dựng của mình - ví dụ: System.getProperty("mainClass") 3) mã nguồn ở nơi nó được cho là theo quy ước, 4) tất cả đều hoạt động khi bạn đưa RunClassvào tập tin xây dựng?
Vidya

Nó chỉ hoạt động nếu build.gradlemainClassName = "runclass.RunClass". Tham số -DmainClasskhông có tác dụng: gradle run -DmainClass=runclass.RunClass2thực thi lớp chính được mã hóa cứng.
Paul Verest

3
Nếu bạn làm cả hai (cách tiếp cận tệp và cách tiếp cận thuộc tính), tôi thực sự không biết cái nào được ưu tiên hơn. Bạn nên tìm câu trả lời đó hoặc không làm cả hai trong thử nghiệm của mình.
Vidya

2
@PaulVerest Đây là những gì tôi đã làm: ext.mainClass = project.hasProperty('mainClass') ? project.getProperty('mainClass') : 'org.gradle.sample.Main' ; apply plugin:'application' ; mainClassName = ext.mainClass Bây giờ khi bạn làm điều gradle -PmainClass=Foo runđó nên sử dụng Foolàm lớp chính.
msridhar

26

Mở rộng câu trả lời của First Zero, tôi đoán bạn muốn thứ gì đó mà bạn cũng có thể chạy gradle buildmà không bị lỗi.

Cả hai gradle buildgradle -PmainClass=foo runApplàm việc với điều này:

task runApp(type:JavaExec) {
    classpath = sourceSets.main.runtimeClasspath

    main = project.hasProperty("mainClass") ? project.getProperty("mainClass") : "package.MyDefaultMain"
}

nơi bạn đặt lớp chính mặc định của mình.


2
Imho đây phải là câu trả lời được chấp nhận. Sử dụng phương thức của FirstZero hoặc Vidya sẽ khiến các tác vụ khác phàn nàn do lớp chính không được chỉ định.
yanhan

Cách tiếp cận của Matt để đặt giá trị chính cũng hoạt động đối với plugin ứng dụng. Tôi đang sử dụng nó với Gradle Kotlin DSL: plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
pvillela

@Matt Cách tiếp cận này phá vỡ chương trình Java đơn giản của tôi sử dụng a Scannerđể đọc nextLine(). Bất kỳ suy nghĩ về một sửa chữa cho điều này? Tiếp tục nhận được "không tìm thấy dòng" khi chạy bằng runApp.
Greg Hilston

2
Cho bất cứ ai đọc sách này trong tương lai, tôi đã sử dụng 'standardInput = System.in` để cho phép thực thi gradle tôi vẫn vượt qua trong đầu vào
Greg Hilston

0

Bạn có thể tham số hóa nó và truyền bản dựng sạch gradle -Pprokey = tạm biệt

task choiceMyMainClass(type: JavaExec) {
     group = "Execution"
    description = "Run Option main class with JavaExecTask"
    classpath = sourceSets.main.runtimeClasspath

    if (project.hasProperty('prokey')){
        if (prokey == 'hello'){
            main = 'com.sam.home.HelloWorld'
        } 
        else if (prokey == 'goodbye'){
            main = 'com.sam.home.GoodBye'
        }
    } else {
            println 'Invalid value is enterrd';

       // println 'Invalid value is enterrd'+ project.prokey;
    }
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.