web-dev-qa-db-ja.com

Gradleで実行可能なJARを作成する

これまではEclipseの "Export ..."機能を使って実行可能なJARファイルを作成していましたが、ビルドの自動化のためにIntelliJ IDEAとGradleに切り替えました。

ここにあるいくつかの記事は "application"プラグインを示唆していますが、これは私が期待する結果に完全に導くものではありません(単なるJAR、起動スクリプトなし、またはこのようなもの)。

Eclipseが「エクスポート...」ダイアログと同じ結果を得るにはどうすればよいですか?

118
Hannes

実行可能jarファイルは、そのマニフェストにMain-Classエントリを含む単なるjarファイルです。そのため、マニフェストにこのエントリを追加するには、 jar task を設定するだけです。

jar {
    manifest {
        attributes 'Main-Class': 'com.foo.bar.MainClass'
    }
}

マニフェストにクラスパスエントリを追加する必要があるかもしれませんが、それは同じ方法で行われます。

http://docs.Oracle.com/javase/tutorial/deployment/jar/manifestindex.html を参照してください。

137
JB Nizet

JB NizetとJorge_Bの答えはどちらも正しいです。

最も簡単な形式では、Gradleを使用して実行可能JARを作成することは、 マニフェスト に適切なエントリを追加するだけのことです。ただし、クラスパスに含める必要がある依存関係を持つことがはるかに一般的であるため、このアプローチは実際には注意が必要です。

アプリケーションプラグイン は別の方法を提供します。実行可能なJARを作成する代わりに、次のものを提供します。

  • ビルドから直接アプリケーションを簡単に実行するためのrunタスク
  • 構築されたJAR、それが依存するすべてのJAR、およびそれらをすべて実行可能なプログラムにまとめる起動スクリプトを含むディレクトリ構造を生成するinstallDistタスク
  • 完全なアプリケーション配布を含むアーカイブを作成するdistZipおよびdistTarタスク(起動スクリプトとJAR)

3つ目の方法は、コンポーネントのコードだけでなくそのすべての依存関係も含む実行可能なJARである、いわゆる "fat JAR"を作成することです。このアプローチを使用するいくつかの異なるプラグインがあります。私が知っているいくつかへのリンクを含めました。もっとあると思います。

88
davidmc24

他の人が指摘したように、jarファイルを実行可能にするには、アプリケーションのエントリポイントをマニフェストファイルのMain-Class属性に設定する必要があります。依存関係クラスファイルが同じ場所に配置されていない場合は、マニフェストファイルのClass-Pathエントリに設定する必要があります。

私はあらゆる種類のプラグインの組み合わせを試してみましたが、実行可能なjarファイルを作成するという単純な作業ではなく、どういうわけか依存関係も含めています。すべてのプラグインが何らかの形で欠けているように見えますが、ようやく私は望んだようになりました。不可解なスクリプトも、ビルドディレクトリを汚染している何百万もの異なるミニファイルも、きれいなビルドスクリプトファイルも、何よりも:私のjarアーカイブにマージされている外国のサードパーティクラスファイルが100万個もありません。

以下は ここ からコピーしたものです。

[方法]サブディレクトリ/libに依存関係jarを含む配布Zipファイルを作成し、マニフェストファイルの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:
    //     https://stackoverflow.com/questions/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の内容

マニフェストバージョン:1.0
メインクラス:com.somepackage.MainClass
クラスパス:lib/commons-lang3-3.3.2.jar

31

私にとっての最小の努力の解決策は gradle-shadow-plugin を利用することでした

プラグインを適用する以外に必要なことは次のとおりです。

Mainクラスをマニフェストにするためのjarタスクを設定します。

jar {
  manifest {
   attributes 'Main-Class': 'com.my.app.Main'
  }
}

Gradleタスクを実行する

./gradlew shadowJar

build/libs /からapp-version-all.jarを取ってください

そして最後にそれを介してそれを実行します。

Java -jar app-version-all.jar
21
Ostkontentitan

InstallAppタスクを試しましたか?一連の起動スクリプトを含む完全なディレクトリを作成しませんか?

http://www.gradle.org/docs/current/userguide/application_plugin.html

5
Jorge_B

コンスタンティンありがとう、それはいくつかのニュアンスと魅力のように働いた。何らかの理由で、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として実行できます。

4
Alex Yavorskiy

モジュール設定(またはプロジェクト構造)でjar成果物を定義できます。

  • 依存関係のあるモジュールからモジュール>モジュールのオープン設定>成果物> +> JAR>を右クリックします。
  • メインクラスを設定します。

Jarを作るのは、BuildメニューからBuild artifact ...をクリックするのと同じくらい簡単です。ボーナスとして、あなたはすべての依存関係を単一のjarファイルにパッケージすることができます。

IntelliJ IDEA 14 Ultimateでテスト済み。

3
Mondain

私は解決策のためにかなりいくつかのリンクをチェックしました。 Gradle 2.9を使用しています。

ビルド、グラドルファイルに次の変更を加えます。

  1. メンションプラグイン:

    apply plugin: 'eu.appsatori.fatjar'
    
  2. ビルドスクリプトを提供します。

    buildscript {
    repositories {
        jcenter()
    }
    
    dependencies {
        classpath "eu.appsatori:gradle-fatjar-plugin:0.3"
    }
    }
    
  3. メインクラスを提供してください:

    fatJar {
      classifier 'fat'
      manifest {
        attributes 'Main-Class': 'my.project.core.MyMainClass'
      }
      exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF'
    }
    
  4. Fatjarを作成します。

    ./gradlew clean fatjar
    
  5. / build/libs /からfatjarを実行します。

    Java -jar MyFatJar.jar
    
2
Sandeep Sarkar