我有一个使用 Gradle 构建工具构建 OSGi 包的简单用例。如果构建路径中存在 java 文件,则构建成功,否则构建失败。
我在 gradle 脚本中使用“osgi”插件并尝试在没有任何 java 文件的情况下构建。构建总是失败并出现以下错误:
无法将 MANIFEST.MF 复制到
我确信在 Gradle 中必须有某种方法可以做到这一点,但不能很好。任何想法可以根据您的经验做些什么来解决这个问题。
我有一个使用 Gradle 构建工具构建 OSGi 包的简单用例。如果构建路径中存在 java 文件,则构建成功,否则构建失败。
我在 gradle 脚本中使用“osgi”插件并尝试在没有任何 java 文件的情况下构建。构建总是失败并出现以下错误:
无法将 MANIFEST.MF 复制到
我确信在 Gradle 中必须有某种方法可以做到这一点,但不能很好。任何想法可以根据您的经验做些什么来解决这个问题。
我今天也遇到了这个问题,@Peter 的修复对我不起作用(我一开始没有应用 java 插件......)。然而,经过几个小时的谷歌搜索,我确实找到了这个线程,这帮助我找到了问题。
基本上,当在 jar 中找不到类文件时,似乎会发生错误(如 Peter 所述) - 我的猜测是因为插件无法扫描类以获取所有Import
和Export
信息所基于的包名称。
我的解决方案是将以下内容添加到清单规范中:
classesDir = theSourceSet.output.classesDir
classpath = theSourceSet.runtimeClasspath
在我的实际构建代码中,我遍历所有源集jar
以为它们创建任务,所以它看起来像这样:
sourceSets.each { ss ->
assemble.dependsOn task("jar${ss.name.capitalize()}", type: Jar, dependsOn: ss.getCompileTaskName('Java')) {
from ss.output
into 'classes'
manifest = osgiManifest {
classesDir = ss.output.classesDir
classpath = ss.runtimeClasspath
// Other properties, like name and symbolicName, also set based on
// the name of the source set
}
baseName = ss.name
}
}
当存在 java 代码时,我也遇到了同样的问题。将这两行添加到 osgiManifest 闭包中解决了这个问题:
classesDir = sourceSets.main.output.classesDir
classpath = sourceSets.main.runtimeClasspath
——埃里克
Running with--stacktrace
表示osgi
插件无法正确处理同时应用osgi
和java
插件但不存在 Java 代码的情况。删除java
插件应该可以解决问题。