Gradle을 & 그루비 - 오류 : 찾거나 메인 클래스를로드 할 수 없습니다

10GritSandpaper :

나는 사용하여 내 프로젝트를 실행할 수 있습니다 gradle run,하지만 난 사용하여 jar 파일을 실행할 수 없습니다 java -jar. :이 샘플 프로젝트에 오류 다시 한 GitHub의에서 프로젝트에 링크를

이를 통해 프로젝트를 실행 한 출력 gradlew

$ ./gradlew run

> Task :run
Hello world.

BUILD SUCCESSFUL in 4s

이 프로젝트를 실행 한 출력 java -jar

$ ./gradlew build

BUILD SUCCESSFUL in 6s

$ java -jar build/libs/emailer.jar 
Error: Could not find or load main class us.company.emailer.App

하지만 때 unzipjar, 내가 볼 수 있습니다App.class

user@computer:../libs$ unzip emailer.jar 
Archive:  emailer.jar
   creating: META-INF/
  inflating: META-INF/MANIFEST.MF    
   creating: us/
   creating: us/company/
   creating: us/company/emailer/
  inflating: us/company/emailer/App.class

여기 년대 build.gradle

plugins {
    id 'groovy'
    id 'application'
}

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    implementation 'org.codehaus.groovy:groovy-all:2.5.6'
    testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
    compile 'org.apache.commons:commons-email:1.5'
}

mainClassName = 'us.company.emailer.App'

jar {
    manifest {
        attributes(
            'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
            'Main-Class': 'us.company.emailer.App'
        )
    }
}

sourceSets.main.java.srcDirs = ['src/main/groovy']

여기 년대 App.groovy

package us.company.emailer

class App {

    String getGreeting() {
        return 'Hello world.'
    }

    static void main(String[] args) {
        println new App().greeting
    }
}

편집 : 추가 MANIFEST.MF@tkruse에서 주석에 응답

Manifest-Version: 1.0
Class-Path: commons-email-1.5.jar javax.mail-1.5.6.jar activation-1.1.
jar
Main-Class: us.company.emailer.App
tim_yates :

문제는 클래스 경로입니다. 당신이 안에 보면 META-INF/MANIFEST.mf파일, 당신은 그것의 세트를 볼 수 있습니다

Class-Path: commons-email-1.5.jar javax.mail-1.5.6.jar activation-1.1.
 jar

자바 실행, 그것은 이러한 것들 중 하나가 있습니다 아무 생각이없는 경우, 또한 그루비 코드를 이해하기 위해 Groovy의 런타임을 필요로한다.

이를위한 가장 간단한 방법은 '로 모든 종속성을 번들하는 지방 단지 "및 Gradle을 함께이를위한 가장 간단한 방법은 우수 그림자 항아리 플러그인 .

당신은 당신에 다음을 추가하는 경우 plugins에 블록 build.gradle:

    id 'com.github.johnrengelman.shadow' version '5.0.0'

(당신은 삭제할 수 있습니다 jar블록과 라인을 조작하는 sourceSets이)

그런 다음 실행 ./gradlew shadowJar

당신은 jar 파일을 얻을 것이다 emailer-all.jar

어느 실행할 수 있습니다 :

$ java -jar build/libs/emailer-all.jar
Hello world.

완성도를 들어, 다음은 전체 build.gradle 파일입니다 :

plugins {
    id 'groovy'
    id 'application'
    id 'com.github.johnrengelman.shadow' version '5.0.0'
}

repositories {
    jcenter()
    mavenCentral()
}

dependencies {
    implementation 'org.codehaus.groovy:groovy-all:2.5.6'
    testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
    implementation 'org.apache.commons:commons-email:1.5'
}

mainClassName = 'us.company.emailer.App'

추천

출처http://43.154.161.224:23101/article/api/json?id=202971&siteId=1