66

Gradle ビルド スクリプトで、ビルド後に作成された JAR ファイルに含まれるマニフェスト ファイルに完全なクラスパスを追加したいと考えています。

例:

Manifest-Version: 1.0
Class-Path: MyProject.jar SomeLibrary.jar AnotherLib.jar

私のビルド スクリプトは、既に次のようにマニフェストに情報を追加しています。

jar {
    manifest {
        attributes("Implementation-Title": project.name,
            "Implementation-Version": version,
            "Main-Class": mainClassName,
    }
}

マニフェストに追加する依存関係のリストを取得するにはどうすればよいですか?


Java チュートリアルのこのページでは、クラスパスをマニフェストに追加する方法と理由について詳しく説明しています: JAR ファイルのクラスパスへのクラスの追加

4

10 に答える 10

82

Gradle のフォーラムで解決策を見つけました。

jar {
  manifest {
    attributes(
      "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
  }
}

出典:サブプロジェクトの Jar タスクにクラスパスを含むマニフェスト

于 2014-03-31T10:45:32.353 に答える
0

同様の問題がありましたが、同一ではありませんでした。lib jar L をアーティファクトで公開し、後でそれをモジュール M の依存関係としてフェッチしましたが、L がコンパイルとランタイムに必要とする推移的な依存関係が一緒に届きませんでした。私のjarが空のpomファイルでartifactoryに公開されたことに気付くのに時間がかかりました。そのため、gradleはLの推移的な依存関係がフェッチされるかを知ることができませんでした。欠落していた部分は、L の build.gradle で、pom を公開するようにという指示でした。gradle の場合と同様に、命令の名前とその意味の間の関係は完全に次のとおりです。

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
} 

ソース: uploading_to_maven_repositories

于 2015-04-12T12:08:12.390 に答える
0

これは、Kotlin DSL (build.gradle.kts) の別のソリューションです。
アプリを実行するとき、ライブラリ ファイルはアプリのサブディレクトリにあるはずlibs/です。

tasks.jar {
    manifest.attributes["Main-Class"] = "com.example.MyMainClass"
    manifest.attributes["Class-Path"] = configurations
        .runtimeClasspath
        .get()
        .joinToString(separator = " ") { file ->
            "libs/${file.name}"
        }
}
于 2022-02-09T13:47:53.997 に答える