47

このbuild.gradleで実行可能なjarを取得しました

apply plugin: 'java'
apply plugin: 'application'

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")

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.+'
    )
}

しかし、依存関係のjarが見つからないため、実行に失敗しました。

そして、私はこのコードを追加します:

task copyToLib(type: Copy) {
    into "$buildDir/output/libs"
    from configurations.runtime
}

しかし、何も変わりません...フォルダーoutput/libsが見つかりません...

依存ライブラリ jar を指定したフォルダまたはパスにコピーするにはどうすればよいですか?

4

7 に答える 7

46

追加:

build.dependsOn(copyToLib)

実行するgradle buildと、Gradle はタスクとそれに依存するすべてのタスクをビルドします (によって宣言されdependsOnます)。を設定build.dependsOn(copyToLib)しないと、Gradle はコピー タスクをビルド タスクに関連付けません。

そう:

apply plugin: 'java'
apply plugin: 'application'

manifest.mainAttributes('Main-Class': 'com.test.HelloWorld')

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.+'
    )
}

task copyToLib(type: Copy) {
    into "${buildDir}/output/libs"
    from configurations.runtime
}

build.dependsOn(copyToLib)
于 2013-10-08T06:03:44.467 に答える
18

アプリケーション プラグインの出力が煩雑で冗長すぎることがわかりました。これが、最終的に満足のいくセットアップを取得した方法です。つまり、サブディレクトリに依存関係の 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:
    //     http://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

于 2015-03-03T06:06:47.560 に答える
1

アプリケーション プラグインでは、メイン クラス名を次のように設定する必要があります。

mainClassName = "com.test.HelloWorld"

これをビルド スクリプトに追加する必要があります。コマンドを使用してアプリケーションを実行しようとするとjava、クラスパスも設定する必要があることに注意して-cpください。

アプリケーション プラグインは、タスクdistZipを提供することで、このプロセスを簡素化します。そのタスクを実行すると、完全なディストリビューションが の下に作成されますbuild/distributions。ディストリビューションには、開始スクリプトとすべての依存関係が含まれています。生成された起動スクリプトによってクラスパスがすでに設定されているため、これ以上処理する必要はありません。

于 2013-02-13T20:04:16.863 に答える