Java 클래스를 실행하는 Gradle (build.gradle을 수정하지 않고)


119

간단한 이클립스 플러그인 Gradle을 실행하는 바로 사용이 발사 Gradle을에 줄 방법을 명령 있음.

Maven 컴파일 및 실행을위한 Gradle 아날로그 란? mvn compile exec:java -Dexec.mainClass=example.Example

이 방법으로 모든 프로젝트를 gradle.build실행할 수 있습니다.

업데이트 : 비슷한 질문이있었습니다 Java 앱을 실행하기위한 maven의 exec 플러그인에 해당하는 gradle은 무엇입니까? 전에 질문했지만 솔루션은 모든 프로젝트를 변경하도록 제안했습니다.build.gradle

package runclass;

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

그런 다음 실행 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   


사용 명령 : Gradle을 실행
a_subscriber

답변:


138

mvn exec:javaGradle에 직접 해당하는 것은 없으며 application플러그인을 적용 하거나 JavaExec작업 이 있어야합니다 .

application 플러그인

플러그인 활성화 :

plugins {
    id 'application'
    ...
}

다음과 같이 구성하십시오.

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

명령 줄에서

$ gradle -PmainClass=Boo run

JavaExec 직무

작업을 정의합니다 execute.

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

실행하려면 gradle -PmainClass=Boo execute. 당신은 얻을

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

mainClass명령 줄에서 동적으로 전달되는 속성입니다. classpath최신 수업을 픽업하도록 설정되어 있습니다.


mainClass속성을 전달하지 않으면 두 방법 모두 예상대로 실패합니다.

$ 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
당신은 수정해야하며 build.gradle, 당신의 자바 소스 클래스 경로 에서 자바 클래스 classpath를 선택하기 위해 하드 코딩됩니다 . 실행할 때에도 클래스 경로는 현재 maven 디렉토리에서 Java 소스 파일을 선택하도록 설정되어 있습니다. 에서 작업, 나도 같은 일을했다. Java 소스에 대한을 변경하면 클래스 경로가 자동으로 변경됩니다. 플러그인을 적용 하거나 작업 이 필요 하다는 점에서 동등한 것은 없습니다 . build.gradle mvn exec:javaJavaExecclasspathmvn exec:javagradleapplicationJavaExec
First Zero

1
또는 다른 옵션은이를 수행하기 위해 자체 플러그인을 작성하고 플러그인을 선택하기 위해 build.gradle을 변경해야하는 것입니다.
First Zero

3
방금 이것을 시도했는데 task execute(...build.gradle에 추가 한 후 다른 모든 작업이 동일한 오류 메시지와 함께 실패하고 gradle이 mainClass가 전달 될 것으로 예상한다고 알려주는 것 같습니다. 나는 청소하거나 만들 수 없습니다.
Nirro

4
@Nirei 대용 main = mainClass으로 main = getProperty("mainClass")더 이상 소리를 지르지 않습니다.
안녕 거버

2
이것은 여전히 ​​중단됩니다 gradle build, 아래 내 대답을 참조하십시오.
Matt

140

Gradle 애플리케이션 플러그인 만 사용하면됩니다 .

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

그리고 간단히 gradle run.

Teresa가 지적했듯이 mainClassName시스템 속성으로 구성 하고 명령 줄 인수로 실행할 수도 있습니다 .


2
그런 모든 클래스를 build.graldle. 그러나 나는 많은 util 클래스가있는 프로젝트를 가지고 있으며 모든 것이 주요 방법을 가지고 있습니다.
Paul Verest 2014 년

그리고 1) 정규화 된 클래스 이름이 올바르다는 것을 확신합니다. 2) 빌드 파일에 올바른 속성 이름을 입력했습니다. 예를 들어 System.getProperty("mainClass") , 3) 소스 코드가 규칙에 따라 있어야하는 위치입니다. 4) 모두 작동합니다. RunClass빌드 파일에 넣을 때 ?
Vidya 2014 년

경우에만 작동 build.gradle있다 mainClassName = "runclass.RunClass". 매개 변수 -DmainClass가 효과가 없음 : gradle run -DmainClass=runclass.RunClass2하드 코딩 된 메인 클래스를 실행합니다.
Paul Verest 2014 년

3
둘 다 수행하면 (빌드 파일 접근 방식과 속성 접근 방식) 실제로 어떤 것이 우선하는지 알 수 없습니다. 테스트에서 그 답을 찾거나 둘 다 수행하지 않아야합니다.
Vidya 2014 년

2
@PaulVerest 내가 한 일은 다음과 같습니다. ext.mainClass = project.hasProperty('mainClass') ? project.getProperty('mainClass') : 'org.gradle.sample.Main' ; apply plugin:'application' ; mainClassName = ext.mainClass 이제 할 때 메인 클래스로 gradle -PmainClass=Foo run사용해야합니다 Foo.
msridhar 2016

25

First Zero의 대답을 확장하면 gradle build오류없이 실행할 수있는 무언가를 원한다고 생각 합니다.

모두 gradle buildgradle -PmainClass=foo runApp이와 작업 :

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

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

기본 기본 클래스를 설정합니다.


2
Imho 이것은 받아 들여진 대답이어야합니다. FirstZero 또는 Vidya의 메서드를 사용하면 메인 클래스가 지정되지 않았기 때문에 다른 작업이 불평 할 수 있습니다.
yanhan

주요 값을 설정하는 Matt의 접근 방식은 응용 프로그램 플러그인에서도 작동합니다. Gradle Kotlin DSL과 함께 사용하고 있습니다. plugins { application }; application { mainClassName = if (project.hasProperty("mainClass")) project.properties.get("mainClass").toString() else "Foo" }
pvillela

@Matt이 접근 방식은 a Scanner를 사용 하여 읽는 간단한 Java 프로그램을 중단 nextLine()합니다. 이것에 대한 수정에 대해 생각하십니까? runApp을 사용하여 실행할 때 "줄을 찾을 수 없음"이 계속 표시됩니다.
Greg Hilston

2
사람이 미래에이 글을 읽고, 나는 아직 입력 전달에 standardInput = System.in` 내 Gradle을 실행 할 수 있도록 '사용
그렉 Hilston

0

매개 변수화하고 gradle clean build -Pprokey = goodbye를 전달할 수 있습니다.

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;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.