web-dev-qa-db-ja.com

実行可能jarをgradleでエクスポートする方法。このjarには参照ライブラリが含まれているため実行できます

実行可能jarをgradleでエクスポートする方法。このjarには参照ライブラリが含まれているため実行できます。

build.gradle

apply plugin: 'Java'

manifest.mainAttributes("Main-Class" : "com.botwave.analysis.LogAnalyzer")

repositories {
    mavenCentral()
}

dependencies {
    compile (
        'commons-codec:commons-codec:1.6',
        'commons-logging:commons-logging:1.1.1',
        'org.Apache.httpcomponents:httpclient:4.2.1',
        'org.Apache.httpcomponents:httpclient:4.2.1',
        'org.Apache.httpcomponents:httpcore:4.2.1',
        'org.Apache.httpcomponents:httpmime:4.2.1',
        'ch.qos.logback:logback-classic:1.0.6',
        'ch.qos.logback:logback-core:1.0.6',
        'org.slf4j:slf4j-api:1.6.0',
        'junit:junit:4.+'
    )
}

実行後:gradle build

ビルドフォルダーを作成し、build/libs/XXX.jarでjarを実行します。

Java -jar build/libs/XXX.jar

ここに実行があります:

Exception in thread "main" Java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/JoranException

参照ライブラリでどのように実行できますか?

40
jychan

Gradle application plugin で実現できます

17
erdi

これが誰かの助けになることを願っています(残念ながら、解決策を見つけるのにかなりの時間を費やしました)。実行可能なJARを作成するために私のために働いたソリューションは次のとおりです。メインメソッドであるJetty 9を特定のものに組み込み、Gradle 2.1を使用しています。

Build.gradleファイルに次のコードを含めます(サブプロジェクトがjarのビルドに必要な「メイン」プロジェクトである場合、このプロジェクトのように開始するサブプロジェクトに追加します( ':'){コードを挿入しますここのどこか、依存関係の後。}。

また、これを機能させるには、プラグインJavaを追加する必要があります:apply plugin: 'Java'。

私のjarタスクは次のようになります:

apply plugin: 'Java'

jar {

    archiveName = "yourjar.jar"

    from {

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

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

    manifest {
        attributes 'Main-Class': 'your.package.name.Mainclassname'
    }

    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
}

そして、コマンドラインからyourjar.jarを実行できます。

Java -jar yourjar.jar

META-INF/。RSA、META-INF /。SFおよびMETA-INF/*。DSAは、機能するために除外する必要があります。そうでない場合、SecurityExceptionがスローされます。

JettyがEclipseに移行し、現在JARに署名しているため、埋め込まれたJettyに問題があるようです。他の未署名のJARが署名済みのJARをロードしたいときに読みます。私がこれで間違っている場合、私を教育してください、それは私が読んだものです。

プロジェクトが依存するJARは、依存関係で次のように定義されます。

dependencies {

    // add the subprojects / modules that this depends on
    compile project(':subproject-1')
    compile project(':subproject-2')

    compile group: 'org.Eclipse.jetty', name: 'jetty-server', version: '9.2.6.v20141205'
    compile group: 'org.Eclipse.jetty', name: 'jetty-servlet', version: '9.2.6.v20141205'
    compile group: 'org.Eclipse.jetty', name: 'jetty-http', version: '9.2.6.v20141205'

}

編集:前だけでなく

configurations.runtime.collect{...}

持っていた

configurations.runtime.asFileTree.files.collect{...}

これにより、クリーンビルドの大規模プロジェクトで奇妙な動作が発生しました。 gradle clean buildを初めて実行した後(ビルドディレクトリを手動でクリーニングした後)jarを実行すると、NoClassDefFoundExceptionがスローされます(多くのサブプロジェクトがあるプロジェクトで)が、gradle clean buildを2回実行した後にjarを実行します(なしでビルドディレクトリを手動で空にする)、何らかの理由ですべての依存関係がありました。 asFileTree.filesが省略された場合、これは起こりませんでした。

また、すべてのコンパイル依存関係がランタイムに含まれていますが、すべてのランタイムがコンパイルに含まれているわけではありません。コンパイルを使用している場合

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

次に、NoClassDefFoundExceptionがスローされた場合、実行時に一部のクラスが見つからないことを忘れないでください。つまり、これも含める必要があります。

        configurations.runtime.collect {
            it.isDirectory() ? it : zipTree(it)
        }
16
flamingo

素早い回答

  1. 次をbuild.gradleに追加します。

    apply plugin: 'application'
    
    mainClassName = 'org.example.app.MainClass'
    
    jar {
        manifest {
            attributes 'Main-Class': mainClassName,
                       'Class-Path': configurations.runtime.files.collect {"$it.name"}.join(' ')
        }
    }
    
  2. プロジェクトディレクトリから、gradle installDistを実行します
  3. Java -jar build/install/<appname>/lib/<appname>.jarを実行します

アプリのバージョンもbuild.gradleに追加することをお勧めしますが、必須ではありません。その場合、ビルドされたjar名は<appname>-<version>.jarになります。

注:私はgradle 2.5を使用しています


詳細

単純に実行できる自己完結型の実行可能jarを作成するには:

Java -jar appname.jar

必要になるだろう:

  1. jarに、アプリケーションのメインクラスを指すマニフェストファイルを含める
  2. すべての依存関係(アプリケーションの外部のjarからのクラス)を含めるか、何らかの方法でアクセス可能にする
  3. 正しいクラスパスを含めるマニフェストファイル

他のいくつかの回答が指摘しているように、 shadowone-jar など、サードパーティのプラグインを使用してこれを実現できます。

シャドウを試しましたが、all私の依存関係とそれらのリソースがアプリケーションコードとともにビルドされたjarに完全にダンプされたという事実は好きではありませんでした。また、外部プラグインの使用を最小限に抑えることも好みます。

別のオプションは、@ erdiが上記で回答したように、 gradle application plugin を使用することです。 gradle buildを実行すると、jarが構築され、Zip/tarファイル内のすべての依存関係にうまくバンドルされます。 gradle installDistを実行して、zip圧縮をスキップすることもできます。

ただし、、@ jeremyjjbrownはそこにコメントを書いたように、プラグインはそうではありません実行可能jar自体を作成します。クラスパスを作成し、コマンドを実行してアプリのメインクラスを実行するjarとスクリプトを作成します。 Java -jar appname.jarを実行することはできません。

両方の利点を最大限に活用するには、上記の手順に従って、すべての依存関係とともにjarを個別のjarとして作成し、正しい値をMANIESTに追加します。

10
elanh

これらの答えはすべて間違っているか、古くなっています。

OPは「ファットジャー」として知られているものを求めています。これはすべての依存関係を含む実行可能なjarファイルであり、実行するために外部の依存関係を必要としません(もちろんJREを除く!)。

執筆時点での答えは、Gradle Shadow Jarプラグインです。これは Shadow Plugin User Guide&Examples でかなり明確に説明されています。

私は少し苦労しました。しかし、これは機能します:

これらすべての行をbuild.gradleファイルのどこかに配置します(先頭近くに配置します)。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4' 
    }
}
apply plugin: 'com.github.johnrengelman.shadow'
shadowJar {
    baseName = 'shadow'
    classifier = null
    version = null
}
jar {
    manifest {
        attributes 'Class-Path': '/libs/a.jar'
        attributes 'Main-Class': 'core.MyClassContainingMainMethod'
    }
}

PSは、ビルドファイルの他の場所にある他の「リポジトリ」、「依存関係」、または「プラグイン」の行を心配せず、do行を残すこの「buildscript」ブロック内(なぜそれを行う必要があるのか​​はわかりません)。

PPS Shadow Pluginユーザーガイドと例はよく書かれていますが、次の行を含めるように指示されていません

attributes 'Main-Class': 'core.MyClassContainingMainMethod'

上に置いたところ。おそらく、著者はあなたが私よりも無知であると仮定しているので、おそらくあなたはそうです。そのような奇妙な「クラスパス」属性を入れるように言われる理由はわかりませんが、壊れていない場合は修正しないでください。

それから行くとき

> gradle shadowjar

Gradleは、/ build/libs(デフォルト名「shadow.jar」)の下に脂肪の実行可能jarを作成することを望んでいます。

> Java -jar shadow.jar
5
mike rodent

ソリューションのかなりの数のリンクをチェックし、最終的にそれを機能させるために以下の手順を実行しました。Gradle2.9を使用しています。

ビルド、gradleファイルで次の変更を行います:

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

apply plugin: 'eu.appsatori.fatjar'

2。 Buildscriptを提供します:

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
1
Sandeep Sarkar