Gradle- 주요 매니페스트 속성 없음


93

Gradle에서 빌드 된 JAR 파일을 실행할 때 발생하는이 오류로 인해 미쳐 가고 있습니다. 오류는 "no main manifest attribute, in RxJavaDemo.jar"로 표시됩니다. Manifest 속성을 조작하려고했지만 종속성이나 무언가를 추가하는 것을 잊은 것 같습니다. 내가 정확히 뭘 잘못하고 있니?

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'demo.MainDashboard'

dependencies {
    compile files ("H:/Processes/Development/libraries/hikari-cp/HikariCP-2.4.1.jar")
    compile files ("H:/Processes/Development/libraries/controls-fx/controlsfx.jar")
    compile files ("H:/Processes/Development/libraries/database_connections/sqlite-jdbc-3.8.6.jar")
    compile files ("H:/Processes/Development/libraries/guava/guava-18.0.jar")
    compile files ("H:/Processes/Development/libraries/rxjava/rxjava-1.0.12.jar")
    compile files ("H:/Processes/Development/libraries/rxjava-extras/rxjava-extras-0.5.15.jar")
    compile files ("H:/Processes/Development/libraries/rxjavafx/RxJavaFX-1.0.0-RC1-SNAPSHOT.jar")
    compile files ("H:/Processes/Development/libraries/rxjavaguava/rxjava-guava-1.0.3.jar")
    compile files ("H:/Processes/Development/libraries/rxjava-jdbc/rxjava-jdbc-0.6.3.jar")
    compile files ("H:/Processes/Development/libraries/slf4j/slf4j-api-1.7.12.jar")
    compile files ("H:/Processes/Development/libraries/tom-commons/tom-commons.jar")
}

sourceSets {
    main.java.srcDir "src/main/java"
    main.resources.srcDir "src/main/resources"
}

jar { 
    manifest {
    attributes(
        "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
    }
    from configurations.compile.collect { entry -> zipTree(entry) }
}

답변:


144

다음과 같이 매니페스트 속성을 변경하십시오.

jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'hello.HelloWorld'
    )
  }
}

그리고 단지 변경 'hello.helloWorld''<your packagename>.<the name of your Main class>'(자신의 메인 클래스는 주요 방법이 있습니다 경우). 이 경우 매니페스트에서이 클래스를 가리키는 속성을 만들면 jar가 실행됩니다.


1
@Stanislav 'Main-Class'값이 메인 클래스입니까? 귀하의 예에서 hello 및 helloWorld는 무엇입니까?
Daniela Maia

2
@DanielaMaia는 정규화 된 클래스 이름 일 뿐이며 hello.HelloWorld로 작성해야합니다. 여기서 hello는 HelloWorld 클래스가있는 패키지입니다
Stanislav

9
나는 collect {}그것이 나를 위해 작동 하도록 부분 을 제거 해야했습니다. 코드는 모든 종속성이 기본 클래스와 동일한 폴더에 있다고 가정합니다.
AutonomousApps

2

jar파일을 실행 가능 하게 만들려면 ( java -jar명령이 작동하도록)에서 Main-Class속성을 지정하십시오 MANIFEST.MF.

Gradle에서는 jar작업 을 구성하여 수행 할 수 있습니다 .

  • 위한 그루비 DSL 이러한 응답 (참조 [1] , [2] )
  • 대한 코 틀린 DSL 다음과 같은 코드를 사용할 수 있습니다 :
tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.caco3.Main"
    }
}

mainClassName예상대로 작동하지 않는 이유 는 무엇 입니까?

아니면 mainClassName매니페스트에서 속성을 지정하지 않는 이유 는 무엇입니까?

mainClassName속성에서 비롯 application플러그인 . 플러그인 :

개발 중에 로컬 에서 애플리케이션을 쉽게 시작하고 운영 체제 별 시작 스크립트를 포함 하여 애플리케이션을 TAR 및 / 또는 ZIP 으로 패키징 있습니다.

너무 application플러그인은 실행 가능한 생산을 목표로하지 않습니다 jar

mainClassName속성 집합은 다음 :

  1. $ ./gradlew runmain속성에 지정된 클래스 에서 메소드를 시작 합니다.
  2. zip/ tar사용 내장하여 보관 distZip/ distTar발사하는 스크립트, 포함 작업을 main지정된 이전 클래스의 방법을.

다음은 메인 클래스를 설정하는 쉘 스크립트 라인입니다.

$ grep Main2 gradletest
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"

1

FWIW-다음 jar 작업을 사용하여 모든 컴파일 종속성을 jar 파일로 조합하고 위의 권장 사항을 사용하여 클래스 경로를 올바르게 설정했습니다.

apply plugin: 'java-library'

jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'your.main.class.goes.here'
    )
  }

  // You can reference any part of the dependency configurations,
  // and you can have as many from statements as you need
  from configurations.compile  
  // I just copied them into the top of the jar, so it looks like the eclipse exported 
  // runnable jar, but you could designate a lib directory, and reference that in the 
  // classpath as "lib/$it.name" instead of it.getName()
  into ''   
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.