使用 gradle 显示第一个 OSGi 构建 - 从 ant 迁移到 Gradle
manifest first OSGi build with gradle - migrating from ant to Gradle
先有manifest吗
http://wiki.osgi.org/wiki/Tooling_Approaches
gradle OSGi 插件?或者如何使用 gradle?
OSGi 容器有一个很大的旧项目,许多项目在 MANIFEST.MF 中声明了复杂的关系。建筑很长。
现在我们想简化事情并采用Gradle。但首先不要破坏事物并保持 ant 和 gradle 并行构建一段时间。
然而,我看到的是 gradle 建议在 build.gradle
中定义 MANIFEST。
https://docs.gradle.org/current/userguide/osgi_plugin.html
这将使大量的复制工作成为可能。
更新有近 100 个模块,模块之间和嵌套 jar 有很多依赖信息。平均 MANIFEST.MF 长度约为 50 行(从 20 到 300 行不等)。
如何捆绑嵌套的 jar 是 other question。
这个问题是关于使用现有的 MANIFEST.MF 文件。我看到的所有插件都使用 bnd
,这与 manifest first 方法完全相反。
Gradle 有一个 OsgiManifest
class,这是一个扩展的 jar 清单:
https://docs.gradle.org/current/javadoc/org/gradle/api/plugins/osgi/OsgiManifest.html
Whosebug 上有一个 post 显示了类似的用法:
How to add Import-Package instructions for runtime dependencies?
相关的 gradle 块如下所示:
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
为了你的'other question':
还有其他 Gradle 用于构建 OSGI 包的插件,在某些情况下,包括来自其他 OSGI 包的依赖项。
例如,Gradle Bundle Plugin,它使用 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 plugin,默认包含传递依赖:
dependencies {
// all your usual dependencies
...
osgiRuntime( "your:dependency:1.0" ) {
transitive = false // transitive dependencies not included in OSGi runtime
}
}
希望这足以让您继续前进。
截至 2016 年 4 月,Maven 或 Gradle OSGi 构建工具中没有清单优先方法。
虽然对于 Eclipse 插件(也是有效的 OSGi 包)有 maven/tycho build,这是 Eclipse Foundation 中的标准,但它对一般的 OSGi 项目没有真正的帮助。
与 Manifest-first 相反的是 Manifest 生成,只有一个工具 bnd
,最初是用于 manifest 创建,然后发展为完整的 bundle jar 构建器,现在有 BndTools Eclipse integration,看类似于 Maven/Gradle 集成管理依赖项。
我建议将 bnd
指令保存在外部标准 bnd.bnd
文件中,而不是将其放入构建脚本中。 *.bnd
文件类似于通常的 Java .properties
文件,因此在 Eclipse IDE 中右键单击,打开方式 -> 其他 ... select Properties File Editor
检查 "Use this editor for.." 并检查 "Use this editor for all '*.nbd' files"
对于Gradle
- [Gradle OSGi 插件](标准,内置)(https://docs.gradle.org/current/userguide/osgi_plugin.html) gives only manifest manipulation, so GRADLE-1107 "OSGi instruction
Include-Resource
not working" 是
自 2010 年以来未解决的问题
- Gradle Bundle Plugin 允许您创建 OSGI 包。它与 Gradle OSGI 插件的主要区别在于它使用 bnd 工具不仅生成清单而且生成整个 jar。
osgi-run
"Osgi-Run - A Gradle plugin to make the development of modular applications using OSGi completely painless"
对于行家
maven-bundle-plugin
又名 Apache Felix Maven Bundle Plugin (BND)
是 “Maven first” approach
bnd-maven-plugin
announce and 2 plugins comparison
所有基于 bnd 的工具现在 collected on http://bnd.bndtools.org/chapters/700-tools.html
https://github.com/paulvi/OSGiBuildExamples
中有一些例子
注意:link http://wiki.osgi.org/wiki/Tooling_Approaches 已在“OSGi Community Wiki 不幸被黑,目前无法使用。
" 状态超过一个星期,而这个问题被打开了。
遗憾的是@Richard 放弃得太早了,还没有得到一些感谢(因为提到了 maven)
先有manifest吗 http://wiki.osgi.org/wiki/Tooling_Approaches gradle OSGi 插件?或者如何使用 gradle?
OSGi 容器有一个很大的旧项目,许多项目在 MANIFEST.MF 中声明了复杂的关系。建筑很长。
现在我们想简化事情并采用Gradle。但首先不要破坏事物并保持 ant 和 gradle 并行构建一段时间。
然而,我看到的是 gradle 建议在 build.gradle
中定义 MANIFEST。
https://docs.gradle.org/current/userguide/osgi_plugin.html
这将使大量的复制工作成为可能。
更新有近 100 个模块,模块之间和嵌套 jar 有很多依赖信息。平均 MANIFEST.MF 长度约为 50 行(从 20 到 300 行不等)。
如何捆绑嵌套的 jar 是 other question。
这个问题是关于使用现有的 MANIFEST.MF 文件。我看到的所有插件都使用 bnd
,这与 manifest first 方法完全相反。
Gradle 有一个 OsgiManifest
class,这是一个扩展的 jar 清单:
https://docs.gradle.org/current/javadoc/org/gradle/api/plugins/osgi/OsgiManifest.html
Whosebug 上有一个 post 显示了类似的用法:
How to add Import-Package instructions for runtime dependencies?
相关的 gradle 块如下所示:
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
为了你的'other question':
还有其他 Gradle 用于构建 OSGI 包的插件,在某些情况下,包括来自其他 OSGI 包的依赖项。
例如,Gradle Bundle Plugin,它使用 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 plugin,默认包含传递依赖:
dependencies {
// all your usual dependencies
...
osgiRuntime( "your:dependency:1.0" ) {
transitive = false // transitive dependencies not included in OSGi runtime
}
}
希望这足以让您继续前进。
截至 2016 年 4 月,Maven 或 Gradle OSGi 构建工具中没有清单优先方法。
虽然对于 Eclipse 插件(也是有效的 OSGi 包)有 maven/tycho build,这是 Eclipse Foundation 中的标准,但它对一般的 OSGi 项目没有真正的帮助。
与 Manifest-first 相反的是 Manifest 生成,只有一个工具 bnd
,最初是用于 manifest 创建,然后发展为完整的 bundle jar 构建器,现在有 BndTools Eclipse integration,看类似于 Maven/Gradle 集成管理依赖项。
我建议将 bnd
指令保存在外部标准 bnd.bnd
文件中,而不是将其放入构建脚本中。 *.bnd
文件类似于通常的 Java .properties
文件,因此在 Eclipse IDE 中右键单击,打开方式 -> 其他 ... select Properties File Editor
检查 "Use this editor for.." 并检查 "Use this editor for all '*.nbd' files"
对于Gradle
- [Gradle OSGi 插件](标准,内置)(https://docs.gradle.org/current/userguide/osgi_plugin.html) gives only manifest manipulation, so GRADLE-1107 "OSGi instruction
Include-Resource
not working" 是 自 2010 年以来未解决的问题 - Gradle Bundle Plugin 允许您创建 OSGI 包。它与 Gradle OSGI 插件的主要区别在于它使用 bnd 工具不仅生成清单而且生成整个 jar。
osgi-run
"Osgi-Run - A Gradle plugin to make the development of modular applications using OSGi completely painless"
对于行家
maven-bundle-plugin
又名 Apache Felix Maven Bundle Plugin (BND) 是 “Maven first” approachbnd-maven-plugin
announce and 2 plugins comparison
所有基于 bnd 的工具现在 collected on http://bnd.bndtools.org/chapters/700-tools.html
https://github.com/paulvi/OSGiBuildExamples
中有一些例子注意:link http://wiki.osgi.org/wiki/Tooling_Approaches 已在“OSGi Community Wiki 不幸被黑,目前无法使用。 " 状态超过一个星期,而这个问题被打开了。
遗憾的是@Richard 放弃得太早了,还没有得到一些感谢(因为提到了 maven)