回答:
実行可能なjarファイルは、マニフェストにMain-Classエントリを含むjarファイルです。したがって、このエントリをマニフェストに追加するには、jarタスクを構成するだけです。
jar {
manifest {
attributes 'Main-Class': 'com.foo.bar.MainClass'
}
}
マニフェストにクラスパスエントリを追加する必要がある場合もありますが、これは同じ方法で行われます。
http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.htmlを参照してください
JB NizetとJorge_Bの答えはどちらも正しいです。
最も単純な形式では、Gradleで実行可能JARを作成することは、マニフェストに適切なエントリを追加することだけです。ただし、クラスパスに含める必要のある依存関係を持つ方がはるかに一般的であるため、このアプローチは実際には扱いにくくなっています。
アプリケーションプラグインは別のアプローチを提供します。実行可能JARを作成する代わりに、以下を提供します。
run
ビルドから直接アプリケーションを簡単に実行できるようにするタスクinstallDist
ビルドされたJAR、依存するすべてのJAR、および実行可能なプログラムにすべてをまとめる起動スクリプトを含むディレクトリ構造を生成するタスクdistZip
およびdistTar
完全なアプリケーション配布を含むアーカイブを作成するタスク(起動スクリプトとJAR)3番目の方法は、いわゆる「ファットJAR」を作成することです。これは、コンポーネントのコードだけでなく、そのすべての依存関係も含む実行可能JARです。このアプローチを使用するプラグインはいくつかあります。私が知っているいくつかへのリンクを含めました。まだまだあると思います。
configurations.runtime
単一のjarにランタイム依存関係をバンドルするには、追加する必要があることに注意してください。
.tar
/ .zip
ファイルをどのように実行しますか?
他の人が指摘したように、jarファイルを実行可能にするには、アプリケーションのエントリポイントをMain-Class
マニフェストファイルの属性に設定する必要があります。依存関係クラスファイルが併置されていない場合Class-Path
は、マニフェストファイルのエントリに設定する必要があります。
私はあらゆる種類のプラグインの組み合わせを試してみましたが、実行可能jarを作成するという単純なタスクではなく、どういうわけか、依存関係を含めました。すべてのプラグインが何らかの方法で不足しているように見えますが、ついに思い通りの結果になりました。不可解なスクリプトはなく、ビルドディレクトリを汚染する100万の異なるミニファイル、かなりクリーンなビルドスクリプトファイル、そして何よりも、100万の外部サードパーティクラスファイルが私のjarアーカイブにマージされていません。
以下は、ここからコピーして貼り付けたものです。
[方法]サブディレクトリに依存関係jarを含む配布zipファイルを作成し、/lib
すべての依存関係をClass-Path
マニフェストファイルのエントリに追加します。
apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.3.2'
}
// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)
jar {
// Keep jar clean:
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes 'Main-Class': 'com.somepackage.MainClass',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}
// How-to add class path:
// /programming/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
結果はにbuild/distributions
あり、解凍されたコンテンツは次のようになります。
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
の内容MyJarFile.jar#META-INF/MANIFEST.mf
:
Manifest-Version:1.0
Main-Class:com.somepackage.MainClass
Class-Path:lib / commons-lang3-3.3.2.jar
lib
生産さのzip / tarファイルのディレクトリではなく、中にいたlib
この答えが示すように、の親ディレクトリ。この解決策は私には申し分なく機能したようです。
"lib/$it.name"
する"$it.name"
と仕事ができます。
私にとって最も簡単な解決策は、gradle-shadow-pluginを利用することでした
プラグインを適用する以外に、実行する必要があるのは次のとおりです。
Mainクラスをマニフェストに入れるようにjarタスクを構成します
jar {
manifest {
attributes 'Main-Class': 'com.my.app.Main'
}
}
Gradleタスクを実行する
./gradlew shadowJar
テイクアプリバージョン-all.jarをからビルドを/ libsに/
そして最後にそれを実行します:
java -jar app-version-all.jar
build.gradle
例です。
'com.my.app.MainKt'
。これ以上の情報がなければ、私はあなたをさらに助けることはできません。
「installApp」タスクを試しましたか?起動スクリプトのセットで完全なディレクトリを作成しませんか?
http://www.gradle.org/docs/current/userguide/application_plugin.html
installApp
、META-INF/MANIFEST.MF
ファイルを作成しません。私は何か間違ったことをしていますか?
コンスタンティン、ありがとうございます。ニュアンスの少ない魅力的な作品でした。何らかの理由で、jarマニフェストの一部としてメインクラスを指定してもうまくいかず、代わりにmainClassName属性が必要でした。これを機能させるためのすべてを含むbuild.gradleのスニペットを次に示します。
plugins {
id 'java'
id 'com.github.johnrengelman.shadow' version '1.2.2'
}
...
...
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
...
...
mainClassName = 'com.acme.myapp.MyClassMain'
...
...
...
shadowJar {
baseName = 'myapp'
}
gradle shadowJarを実行した後、ビルドフォルダーにmyapp- {version} -all.jarを取得します。これは、java -jar myapp- {version} -all.jarとして実行できます。
私は解決策のかなりの数のリンクをチェックし、最終的にそれを機能させるために下記の手順を実行しました。Gradle 2.9を使用しています。
build、gradleファイルに次の変更を加えます。
メンションプラグイン:
apply plugin: 'eu.appsatori.fatjar'
Buildscriptを提供します。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "eu.appsatori:gradle-fatjar-plugin:0.3"
}
}
メインクラスを提供します。
fatJar {
classifier 'fat'
manifest {
attributes 'Main-Class': 'my.project.core.MyMainClass'
}
exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF'
}
fatjarを作成します。
./gradlew clean fatjar
/ build / libs /からfatjarを実行します。
java -jar MyFatJar.jar