使用Gradle在清单中添加类路径

Pao*_*oni 42 java gradle

我希望我的Gradle构建脚本将完整的Classpath添加到构建后创建的JAR文件中包含的清单文件中.

例:

Manifest-Version: 1.0
Class-Path: MyProject.jar SomeLibrary.jar AnotherLib.jar
Run Code Online (Sandbox Code Playgroud)

我的构建脚本已经以这种方式向清单添加了一些信息:

jar {
    manifest {
        attributes("Implementation-Title": project.name,
            "Implementation-Version": version,
            "Main-Class": mainClassName,
    }
}
Run Code Online (Sandbox Code Playgroud)

如何获取要添加到清单的依赖项列表?


这个Java教程页面更详细地描述了如何以及为什么将类路径添加到清单中:将类添加到JAR文件的类路径中

Pao*_*oni 67

在Gradle的论坛上找到了解决方案:

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

来源:子项目的Jar任务中的类路径清单

  • 这对某些人来说可能比对其他人更明显.但是确保`*jar`目标规则在你的`依赖`规则之后被调用*.这个小细节让我今天卡住了很长一段时间..请参阅[这个要点](https://gist.github.com/simon04/6865179). (13认同)
  • ..然后,如果你想将应用程序与外部依赖项一起打包,请参阅[this gist](https://gist.github.com/MartinanderssonDotcom/c63675ce87947da1ef4a).分发zip将转到文件夹`build\distributions`. (3认同)
  • 我需要删除“collect {}”部分才能使其对我有用。这假设所有依赖项都与主类位于同一文件夹中,但这对我来说并非如此。 (2认同)
  • 如果它不起作用,请尝试用绝对路径替换名称。 (2认同)

Eng*_*uad 16

在gradle这个最新版本,compileruntime变得过时.相反,使用runtimeClasspath如下:

'Class-Path': configurations.runtimeClasspath.files.collect { it.getName() }.join(' ')
Run Code Online (Sandbox Code Playgroud)


fss*_*lva 6

将其放在buid.gradle文件的末尾.将其更改com.example.Main为您自己的Main类.

jar {
    doFirst {
        manifest {
            if (!configurations.compile.isEmpty()) {
                attributes(
                        'Class-Path': configurations.compile.collect{it.toURI().toString()}.join(' '),
                        'Main-Class': 'com.example.Main')
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mah*_*zad 6

这是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}"
        }
}
Run Code Online (Sandbox Code Playgroud)


Vik*_*kas 5

最佳答案对她帮助很大。这对我有用:

jar {
manifest {
    attributes "Main-Class": "your.package.classWithMain"
    attributes "Class-Path": configurations.compile.collect { it.absolutePath }.join(" ")
}
}
Run Code Online (Sandbox Code Playgroud)

因此,我不得不使用absolutePath而不是名称。这可能对您不起作用。有些人建议使用运行时而不是编译。我使用compile是因为,我的build.gradle中有一个依赖项的compile部分。因此,jar步骤从此处获取依赖项。最好的办法是拿起您认为会起作用的内容,进行gradle构建,然后找到JAR文件,并将其展开以找到META-INF / MANIFEST.MF文件。您应该能够看到所有目录,并用空格分隔。如果没有,您应该尝试其他方法。IDE的自动完成功能应有助于查看在配置/编译等下所有可用的方法或字段。所有这些操作都可以在IntelliJ中轻松完成。

哦..,如果您想查看库JAR在磁盘上的实际位置,请右键单击项目->打开模块设置->库,然后单击任何库。