我希望我的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)
Eng*_*uad 16
在gradle这个最新版本,compile并runtime变得过时.相反,使用runtimeClasspath如下:
'Class-Path': configurations.runtimeClasspath.files.collect { it.getName() }.join(' ')
Run Code Online (Sandbox Code Playgroud)
将其放在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)
这是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)
最佳答案对她帮助很大。这对我有用:
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在磁盘上的实际位置,请右键单击项目->打开模块设置->库,然后单击任何库。
| 归档时间: |
|
| 查看次数: |
74292 次 |
| 最近记录: |