マルチプロジェクトビルドがあり、サブプロジェクトの1つにファットjarをビルドするタスクを配置します。 クックブックに記載されている に似たタスクを作成しました。
jar {
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' }
}
実行すると、次のエラーが発生します。
原因:未解決の状態にない構成は変更できません!
このエラーの意味がわかりません。 バグの場合、Gradle JIRAでもこれを報告しました 。
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) }
}
}
mainClassName
はjar {
の前に表示する必要があることに注意してください。
jar
タスクを正常に動作させ、追加のfatJar
タスクを使用する場合は、次を使用します。
task fatJar(type: Jar) {
classifier = 'all'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
重要な部分はwith jar
です。これがないと、このプロジェクトのクラスは含まれません。
@felixの答えはほとんど私をそこに連れてきました。 2つの問題がありました。
次のセットアップはこれを解決します
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.runtime
をconfigurations.runtimeClasspath
に変更
これは私には問題ありません。
私のメインクラス:
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
メインの実行可能クラスでファット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'
}
簡単な解決
jar {
manifest {
attributes 'Main-Class': 'cova2.Main'
}
doFirst {
from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } }
}
}
私の依存関係が大きすぎて次のエラーが発生したことを除いて、@ benからの答えはほとんど私にとってはうまくいきます
Execution failed for task ':jar'.
> archive contains more than 65535 entries.
To build this archive, please enable the Zip64 extension.
この問題を解決するには、次のコードを使用する必要があります
mainClassName = "com.company.application.Main"
jar {
manifest {
attributes "Main-Class": "$mainClassName"
}
Zip64 = true
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}