Gradle-メインマニフェスト属性なし


91

Gradleから構築されたJARファイルを実行しているときに発生するこのエラーに夢中になっています。「RxJavaDemo.jarにメインのマニフェスト属性がありません」というエラーが表示されます。マニフェストプロパティを操作しようとしましたが、依存関係などを追加するのを忘れていると思います。私は正確に何を間違っているのですか?

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) }
}

回答:


142

次のようにマニフェスト属性を変更してみてください。

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>'(Mainクラスにmainメソッドがある)に変更します。この場合、マニフェストでこのクラスを指す属性を作成すると、jarが実行されます。


1
@ Stanislav'Main-Class '値はメインクラスですか?あなたの例では、helloとhelloWorldは何ですか?
ダニエラマイア

2
@DanielaMaiaこれは完全修飾クラス名であり、hello.HelloWorldと記述する必要があります。ここで、helloはHelloWorldクラスが配置されているパッケージです
Stanislav

9
私はcollect {}それが私のために働くようにするためにその部分を取り除く必要がありました。コードは、すべての依存関係がメインクラスと同じフォルダーにあることを前提としています。
AutonomousApps

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 ''   
}

0

ようにするにはjar、ファイルを実行可能に(そうすることをjava -jarコマンドが動作します)、指定Main-Classに属性をMANIFEST.MF

Gradleでは、jarタスクを構成することでそれを行うことができます。

  • 以下のためにGroovyのDSLはこれらの答えを参照してください([1] [2]
  • 以下のためにKotlin DSLは、次のコードスニペットを使用することができます。
tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.caco3.Main"
    }
}

なぜmainClassName期待どおりに機能しないのですか?

またはmainClassName、マニフェストで属性を指定しないのはなぜですか?

mainClassNameプロパティは、から来ているapplicationプラグイン。プラグイン:

開発中にアプリケーションをローカルで簡単に起動でき、オペレーティングシステム固有の起動スクリプトを含むTARZIPとしてアプリケーションをパッケージ化できます。

したがって、applicationプラグインは実行可能ファイルjarの生成を目的としていません

ときにmainClassNameプロパティセットは、次のようになります。

  1. $ ./gradlew runmain属性で指定されたクラスのメソッドを起動します
  2. /タスクを使用して構築されたzip/tarアーカイブには、指定された以前のクラスのメソッドを起動するスクリプトが含まれます。distZipdistTarmain

メインクラスを設定するシェルスクリプトの行は次のとおりです。

$ grep Main2 gradletest
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.