42

gradle で実行可能な jar をエクスポートする方法、およびこの 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.+'
    )
}

私が実行した後:グラドルビルド

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

参照ライブラリで実行するにはどうすればよいですか?

4

5 に答える 5

18

Gradleアプリケーションプラグインで実現できます

于 2013-02-01T08:50:01.697 に答える
17

これが誰かの役に立てば幸いです(残念ながら、解決策を見つけるのにかなりの時間を費やしました)。実行可能なJARを作成するために私にとってうまくいった解決策は次のとおりです。私はJettyをmainメソッドに埋め込んでおり、具体的には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 は、次のように依存関係で定義されます。

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 がスローされます (多くのサブプロジェクトを含むプロジェクトで)。ビルドディレクトリを手動で空にする)、何らかの理由ですべての依存関係がありました。asFileTree.files を省略した場合、これは発生しませんでした。

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

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

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

        configurations.runtime.collect {
            it.isDirectory() ? it : zipTree(it)
        }
于 2015-01-23T14:14:43.583 に答える