使用 gradle 构建的第一个 OSGi 清单 - 从 ant 迁移到 Gradle

2022-09-01 16:15:11

OSGi是否有清单第一 http://wiki.osgi.org/wiki/Tooling_Approaches gradle 插件?或者如何使用gradle来做到这一点?

OSGi容器有一个很大的旧项目,许多项目在MANIFEST中声明了复杂的关系。断续器构建时间很长。现在我们想简化事情并采用Gradle。但首先不要破坏东西,并保持蚂蚁和蚂蚁在一段时间内并行构建。然而,我看到的是gradle建议在里面定义MANIFEST。https://docs.gradle.org/current/userguide/osgi_plugin.html
这将使大量的复制工作。build.gradle

更新 有近100个模块,模块之间和嵌套jar之间有很多依赖关系信息。平均清单。MF长度约为50行(从20到300行不等)。如何捆绑嵌套罐是另一个问题。这个问题是关于使用现有的清单。MF 文件。我看到的所有插件都与明显的第一种方法完全相反。bnd


答案 1

Gradle 有一个类,它是一个扩展的 jar 清单:OsgiManifest

https://docs.gradle.org/current/javadoc/org/gradle/api/plugins/osgi/OsgiManifest.html

StackOverflow上有一篇文章显示了类似的用法:

如何为运行时依赖项添加导入包指令?

相关的渐变块如下所示:

apply plugin: 'java'
apply plugin: 'osgi'

jar {
    baseName = 'awesome'
    manifest {
        name = 'An Awesome Application'
        symbolicName = 'com.example.awesome'
        instruction 'Import-Package', 'org.springframework.orm', '*'
    }
}

如果您有现有的清单,并且想要使用自己的自定义文件,则可以通过在 jar 闭包中设置清单文件位置来执行此操作:

jar {
    manifest {
        def manif = "${resourcesDir}/MANIFEST.MF"
        if (new File(manif).exists()) {
            from file(manif)
        }
        else{
            name = 'overwrittenSpecialOsgiName'
            instruction 'Private-Package', 'org.mycomp.somepackage'
            instruction 'Bundle-Vendor', 'MyCompany'
            instruction 'Bundle-Description', 'Platform2: Metrics' 
        }
    }
}

Gradle清单的文档可以在这里找到:https://docs.gradle.org/current/javadoc/org/gradle/api/java/archives/Manifest.html

对于您的“其他问题”:

还有其他用于构建OSGI捆绑包的Gradle插件,在某些情况下,包括来自其他OSGI捆绑包的依赖项。

例如,有Gradle Bundle插件,它使用bnd工具,允许您指定包括传递依赖关系,甚至排除不需要的依赖关系。例如:

jar {
    manifest {
        attributes 'Implementation-Title': 'Bundle Quickstart',     // Will be added to manifest
                     'Import-Package': '*'  // Will be overwritten by the instuctions below
    }
}

bundle {
    includeTransitiveDependencies = true

    instructions << [
        'Bundle-Activator': 'foo.bar.MyBundleActivator',
        'Import-Package': 'foo.*',
        '-sources': true
    ]

    instruction 'Export-Package', '*' // Specify an individual instruction
    instruction '-wab', ''
}

还有Gradle osgi-run插件,默认情况下包括传递依赖项:

dependencies {
    // all your usual dependencies
    ...

    osgiRuntime( "your:dependency:1.0" ) {
        transitive = false // transitive dependencies not included in OSGi runtime
    }
}

希望这足以让你继续前进。


答案 2

截至 2016 年 4 月,Maven 或 Gradle 针对 OSGi 的构建工具中没有 Manifest-first 方法。

虽然对于 Eclipse 插件(也是有效的 OSGi 捆绑包),有 maven/tycho 构建,这是 Eclipse Foundation 中的标准配置,但它对一般的 OSGi 项目并没有真正的帮助。

Oposite到Manifest-first是Manifest generation,只有一个工具,最初用于创建 Manifest,然后发展成为完整的捆绑包jar builder,现在具有BndTools Eclipse集成,看起来类似于Maven / Gradle集成管理依赖关系。bnd

我建议将说明保留在外部标准文件中,而不是将其放在构建脚本中。 文件类似于通常的Java文件,所以在Eclipse IDE中右键单击,用->打开其他...选择选中“将此编辑器用于..”,然后选中“将此编辑器用于所有'*.nbd'文件”bndbnd.bnd*.bnd.propertiesProperties File Editor

对于格雷德尔

对于专家

现在,所有基于 bnd 的工具都收集在 http://bnd.bndtools.org/chapters/700-tools.html

https://github.com/paulvi/OSGiBuildExamples

注意:链接 http://wiki.osgi.org/wiki/Tooling_Approaches 已经处于“OSGi社区Wiki不幸被黑客入侵,目前不可用”状态超过一周,而这个问题被打开。

可悲的是,@Richard过早地放弃了,也没有得到一些感谢(因为提到了maven)


推荐