153

マルチプロジェクトビルドがあり、サブプロジェクトの1つにファットjarをビルドするタスクを配置しました。クックブックに記載されているものと同様のタスクを作成しました。

jar {
  from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' }
}

これを実行すると、次のエラーが発生します。

原因:未解決の状態でない構成を変更することはできません!

このエラーの意味がわかりません。バグの場合に備えて、GradleJIRAでもこれを報告しました

4

17 に答える 17

239

Gradle に対するソリューションを JIRAに投稿しました。

// Include dependent libraries in archive.
mainClassName = "com.company.application.Main"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

mainClassNameBEFORE を指定する必要があることに注意してくださいjar {

于 2011-02-04T03:34:23.663 に答える
75

@felix の回答で、ほとんどそこにたどり着きました。私には2つの問題がありました:

  1. Gradle 1.5 では、fatJar タスク内でマニフェスト タグが認識されなかったため、Main-Class 属性を直接設定できませんでした。
  2. jar には競合する外部 META-INF ファイルがありました。

次のセットアップはこれを解決します

jar {
  manifest {
    attributes(
      'Main-Class': 'my.project.main',
    )
  }
}

task fatJar(type: Jar) {
  manifest.from jar.manifest
  classifier = 'all'
  from {
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
  } {
    exclude "META-INF/*.SF"
    exclude "META-INF/*.DSA"
    exclude "META-INF/*.RSA"
  }
  with jar
}

これを標準のアセンブルまたはビルド タスクに追加するには、以下を追加します。

artifacts {
    archives fatJar
}

編集: @mjaggard に感謝: Gradle の最近のバージョンではconfigurations.runtimeconfigurations.runtimeClasspath

于 2015-07-15T09:22:55.593 に答える
9

これは私にとってはうまくいきます。

私のメインクラス:

package com.curso.online.gradle;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

public class Main {

    public static void main(String[] args) {
        Logger logger = Logger.getLogger(Main.class);
        logger.debug("Starting demo");

        String s = "Some Value";

        if (!StringUtils.isEmpty(s)) {
            System.out.println("Welcome ");
        }

        logger.debug("End of demo");
    }

}

そして、それは私のファイル build.gradle の内容です:

apply plugin: 'java'

apply plugin: 'eclipse'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
    compile  'org.apache.commons:commons-lang3:3.0'
    compile  'log4j:log4j:1.2.16'
}

task fatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.curso.online.gradle.Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

そして、コンソールに次のように記述します。

java -jar ProyectoEclipseTest-all.jar

そして、出力は素晴らしいです:

log4j:WARN No appenders could be found for logger (com.curso.online.gradle.Main)
.
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more in
fo.
Welcome
于 2014-08-10T19:42:00.960 に答える
6

メインの実行可能クラスを含むファット JAR を生成し、署名付き JAR の問題を回避するには、gradle-one-jar pluginをお勧めします。One-JAR プロジェクトを使用するシンプルなプラグイン。

使いやすい:

apply plugin: 'gradle-one-jar'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.github.rholder:gradle-one-jar:1.0.4'
    }
}

task myjar(type: OneJar) {
    mainClass = 'com.benmccann.gradle.test.WebServer'
}
于 2015-10-29T17:08:23.723 に答える
5

シンプルなソリューション

jar {
    manifest {
        attributes 'Main-Class': 'cova2.Main'
    } 
    doFirst {
        from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
    }
}
于 2015-02-09T21:26:46.637 に答える
-1

Ant に慣れている場合は、Gradle でも同じことを試すことができます。

task bundlemyjava{
    ant.jar(destfile: "build/cookmyjar.jar"){
        fileset(dir:"path to your source", includes:'**/*.class,*.class', excludes:'if any')
        } 
}
于 2015-04-28T12:58:21.683 に答える