実行可能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
参照ライブラリでどのように実行できますか?
Gradle application plugin で実現できます
これが誰かの助けになることを願っています(残念ながら、解決策を見つけるのにかなりの時間を費やしました)。実行可能な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)
}
次を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(' ')
}
}
gradle installDist
を実行しますJava -jar build/install/<appname>/lib/<appname>.jar
を実行しますアプリのバージョンもbuild.gradle
に追加することをお勧めしますが、必須ではありません。その場合、ビルドされたjar名は<appname>-<version>.jar
になります。
注:私はgradle 2.5を使用しています
単純に実行できる自己完結型の実行可能jarを作成するには:
Java -jar appname.jar
必要になるだろう:
他のいくつかの回答が指摘しているように、 shadow や one-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に追加します。
これらの答えはすべて間違っているか、古くなっています。
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
ソリューションのかなりの数のリンクをチェックし、最終的にそれを機能させるために以下の手順を実行しました。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