我们有一个很大的(约215个捆绑和计数)osgi(felix + springdm)项目,使用maven和maven-osgi插件构建.
我们用maven方式遇到了几个问题:
1.子模块pom必须继承父pom才能利用公共变量和依赖关系(没关系)但是父pom必须包含所有的包,以便能够一起构建所有内容.这种循环引用很难保持同步.
2.子捆绑的单独版本是如此复杂,以至于(在我加入项目之前)决定对所有捆绑使用相同的版本.这意味着我们现在更新每个版本的所有捆绑包的版本,如果只是实际更改了它们中的一堆.这使得osgi的整个概念有点无意义恕我直言.请注意,我并不是说我们继续只触及少数捆绑包,我们会处理所有这些捆绑包,但每个版本通常都包含1或2个功能,这些功能只会影响一些捆绑包.
3.为了完成包和最终工件的部署,我们还需要另一个子模块来导入部署所需的所有包(除了少数用于测试和模拟).[编辑]请注意,这个聚合与主pom中的聚合不同,因为它不编译bundle而只是从maven存储库中选择它们.
4. maven依赖系统和osgi插件导入有时难以保持一致.忘记导入或放置错误的依赖关系太容易了.
[编辑]在每个捆绑pom中有一个这样的部分:`
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>
</Export-Package>
<Import-Package>
com.google.gson,
org.apache.log4j,
org.apache.log4j.spi,
org.dom4j,
com.myinterfaces
</Import-Package>
</instructions>
</configuration>
</plugin>`
Run Code Online (Sandbox Code Playgroud)
出于所有这些原因,我们还可以,但对maven并不十分满意.最近有人提议Gradle不是灵丹妙药,而是对当前形势的明确改进.
你会建议搬到gradle吗?如果哪种方式最好?
有其他人遇到过同样的情况吗?我认为所有与Osgi的大项目都应该是共同的.
免责声明:我寻找类似的问题:
但要么在哪里不关于osgi submodules或不关于gradle.
我是OSGi的新手,并创建了一个OSGi-bundle,我在Apache Felix OSGi-container中运行.捆绑包中包含一个文件资源,我需要将其作为传递给方法java.io.File.要实例化File-object,需要"file"-scheme中的URI或字符串作为字符串.如何以干净的方式检索任何这些?
我尝试使用
context.getBundle().getResource("/myfile")(org.osgi.framework.BundleContext返回类型的上下文)返回URI bundle://6.0:0/myfile.但是这个URI不能使用File(URI uri)构造函数转换为File-instance,因为它具有"bundle"-scheme.
可以尝试构建一个知道工作目录的位置路径并利用我的bundle的bundleId,但我怀疑这是最好的做法.
有任何想法吗?
我在我的OSGi项目中使用了Felix Framework,但是我遇到了一个关于第三方依赖的严重问题.
我正在使用eclipse和maven-bundle-plugin从源代码生成我的bundle,从POM.XML文件生成MANIFEST.MF.到现在为止还挺好.然而,当我在我的包中有一些第三方依赖时,我发现自己正在寻找一个无限的JAR列表,它们通常不是捆绑包,并将它们放在我的/ bundle Felix目录中,直到不再缺少依赖项为止.
我将此过程称为"下载Internet以使我的OSGi应用程序正常工作".
我究竟做错了什么?当然,我必须做一些非常错误的事情,因为我无法想象任何人有一个依赖于B的捆绑A,然后依赖于C和D,然后这两个将取决于其他几个等等......去寻找所有这些依赖关系手动使用谷歌或maven中央!那太疯狂了!
什么是自动化的正确方法?我希望有两种解决方案之一:
1)能够创建一个嵌入了所有依赖项的大型JAR文件,但只导出我想要的包,而且只导出corse,而不是导入任何包.
2)(我的首选解决方案)有办法将我的所有依赖项都放到单独的JAR文件中,我可以简单地粘贴到/ bundle目录中.
3)(甚至更优选)有一种方法可以使用第三方JAR而无需将8GB的依赖项下载到我的项目中.
我找到了这样做的工具,但仅用于直接(1度)依赖关系,为我提供了传递依赖关系以便手动解决.
这个问题至关重要.缺少这样的工具会妨碍OSGi的使用.我搜索,搜索和搜索,我遇到了所有101种解决方案,如PAX,bndtools和朋友,但似乎他们没有解决这个问题......
请帮我.请提供一个活生生的例子,如果可以的话,世界各地的人都会从这个问题的解决方案中受益.
谢谢!
编辑:我附加了一个示例项目,我正在尝试使用JScience,但生成的JAR包不断询问我新的Imports,即它不是自包含的.
链接到示例:https://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0
我通常尝试使用Eclipse将第三方JAR转换为捆绑包,但它们总是必须导入我没有的包,所以这是一个无休止的情况,如你所说.
我找不到任何关于maven-bundle-plugin标签Conditional_Package的文档.但是相关的搜索显示我之前尝试过的内联选项没有成功.
我创建了一个基本项目,其中我有一个使用JScience库的类,在其POM.XML中我有以下内容:
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId};singleton:=true
</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Export-Package>shared.properties.api, shared.properties.base
</Export-Package>
<Embed-Dependency>!org.osgi.*;scope=compile|runtime;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)
我说maven要内联所有不是来自osgi框架本身的包.看看生成的JAR看起来相当不错,我现在只嵌入了包而不是整个JAR(但是我认为我不需要所有那些内联包,因为我只使用其中两个).此外,如果我打开MANIFEST.MF文件,我可以看到这个有问题的行:
Manifest-Version: 1.0
Bnd-LastModified: 1414164534170
Build-Jdk: 1.6.0_65
Built-By: Pedro
Bundle-ManifestVersion: 2
Bundle-Name: RequireJscienceExample
Bundle-SymbolicName: RequireJscienceExample;singleton:=true
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: !org.osgi.*;scope=compile|runtime;inline=true …Run Code Online (Sandbox Code Playgroud) pax-runner apache-felix apache-karaf maven-bundle-plugin bndtools
在Android上使用OSGi平台时我得到了这个errormsg:

致命信号7(SIGBUS)位于0x595302e0(代码= 2)
我认为我的应用程序在内存中需要那么多空间或者需要很多计算能力.它只是OSGi平台,有20个捆绑包.
我的应用程序总是在那之后重新启动.
有任何想法吗 ?
我有一个OSGI应用程序,我有大约30个捆绑(jar文件).今天我决定看看它是如何工作的/如果它适用于Java 9.
所以我开始申请并得到了
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.felix.framework.util.SecureAction (file:/home/.../jar/org.apache.felix.framework-5.4.0.jar) to method java.net.URLClassLoader.addURL(java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.util.SecureAction
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Run Code Online (Sandbox Code Playgroud)
经过一些阅读后,我添加了命令行选项
--add-exports java.base/java.net=org.apache.felix.framework
Run Code Online (Sandbox Code Playgroud)
并使用以下内容创建文件module-info.java:
module org.apache.felix.framework { }
Run Code Online (Sandbox Code Playgroud)
我有两个问题.我应该把这个module-info.java放在哪里让jvm读取它?我该如何将这个模块信息与org.apache.felix.framework-5.4.0.jar文件/ bundle/jar绑定?
如果我做错了,请告诉我解决这个问题的正确方向.
我有一组使用Maven构建的OSGi包,我想知道是否有可用的Maven插件允许我执行以下操作:
我做了一些谷歌搜索,除了appassembler我没有找到任何有希望的东西.有没有人想出一个好的解决方案?
更新 这里是我想要完成的一个例子.
example-parent\
bundle-one
bundle-two
bundle-three
assembly-one
assembly-two
Run Code Online (Sandbox Code Playgroud)
其中assembly-one将包括bundle-one和bundle-two并且assembly-two将包括bundle-two和bundle-three或它们的任意组合.然后,当您构建项目时,您将获得两个zip文件,一个用于assembly-one,一个用于assembly-two包含自定义felix安装中的相应包.例如:
assembly-one.zip\
bin\felix.jar
bundle\bundle-one, bundle-two, plus bare min felix bundles
conf\any configuration files I need
Run Code Online (Sandbox Code Playgroud)
希望这可以提供更多关于我正在努力实现的信息.我想这有点类似于Eclipse做feature.xml的方式,但当然不使用Eclipse.
使用Felix/Equinox,以下内容如何做?
osgi:install
osgi:refresh
osgi:resolve
osgi:restart
osgi:update
Run Code Online (Sandbox Code Playgroud)
某处有状态机图或更简洁的文档吗?
我目前正在开始使用OSGi,iPOJO和iPOJO Annotations,并尝试构建一个在Felix中部署的简单组件.不幸的是,我遇到了各种问题,这些问题花了我几个小时才解决,或者在浪费时间之后我甚至无法解决,如下所示:
我想使用我们使用Maven构建的OSGi包中的现有库.图书馆目前不是"OSGI-ified",我们不打算在中期内这样做.因此,我希望使用...包含此库及其所有依赖项.
<Embed-Dependency>*</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
Run Code Online (Sandbox Code Playgroud)
我现在拥有的是OSGi组件的以下pom.xml文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo</groupId>
<artifactId>samplecomponent</artifactId>
<packaging>bundle</packaging>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<encoding>UTF-8</encoding>
</compilerArguments>
<showDeprecation>true</showDeprecation>
<verbose>true</verbose>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<version>2.3.6</version>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Embed-Dependency>*</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Embed-Directory>lib</Embed-Directory>
<Export-Package>*</Export-Package>
<_exportcontents>*</_exportcontents>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-ipojo-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>ipojo-bundle</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.ipojo.annotations</artifactId>
<version>1.8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>foo</groupId>
<artifactId>mylibrary</artifactId>
<version>1.2.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project> …Run Code Online (Sandbox Code Playgroud) 在我的osgi应用程序中,我有三个包travel.api,table.api和utils.travel.api取决于table.api哪个取决于utils.注意,travel.api不直接依赖utils.我使用aQute Bnd来生成清单,我相信它工作正常.清单如下所示.
有一个叫做类PageData的字段TableData,它有一个类型的字段,而这个字段又有一个类型的字段TestObject.PageData坐落于travel.api,TableData位于table.api以及TestObject位于utils.加载包时,这一切都正常.当我收到表示PageData对象的字节数组时,问题出现了.我必须在travel.api捆绑中反序列化它.这应该不是问题,因为它是定义的地方.我使用org.jboss.netty.handler.codec.serialization.ObjectDecoderInputStream并从travel.apibundle中传入类加载器.抛出以下异常,但基本上它说:
Caused by: java.lang.ClassNotFoundException: com.openaf.utils.TestObject not
found by travel.api [9].
Run Code Online (Sandbox Code Playgroud)
现在,这是有道理的,因为如果你看Import-Package的travel.api,你会看到com.openaf.utils(其中TestObject位于)未列出.如果我添加此包,则正确反序列化.但是,这似乎不是一个好的通用解决方案,因为我必须遍历每个PageData使用的字段并确保它们都在此模块中导入,并递归地在这些字段包含的每个字段等.
我在这里做错了吗?
使用OSGi时反对对象反序列化的最佳方法是什么?
如果我正确地做了并且我必须指定所有"深度"导入,有没有办法让Bnd进行"深度"生成?
任何帮助将不胜感激!
我正在使用felix v4作为我的osgi库.
Manifest-Version: 1
Bnd-LastModified: 1355404320862
Bundle-ManifestVersion: 2
Bundle-Name: travel.api
Bundle-SymbolicName: …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用Apache Felix声明性服务,我正在寻找一个描述可以给@Reference注释的参数的备忘单.我看过一个网页,其中包含一个非常丰富的备忘单(或表格),但我似乎无法找到它.我认为这对很多Felix用户来说都很有用.我正在谈论的参数:
MANDATORY_UNARY, MANDATORY_MULTIPLE, OPTIONAL_UNARY, OPTIONAL_MULTIPLEEVENT, LOOKUPDYNAMIC, STATICGREEDY, RELUCTANT基数相当简单,但其他人对我来说并不清楚.他们做了什么以及他们如何运作?
apache-felix ×10
osgi ×8
java ×5
maven ×3
android ×1
apache-karaf ×1
bnd ×1
bndtools ×1
cradle ×1
equinox ×1
file-access ×1
java-9 ×1
java-platform-module-system ×1
libc ×1
pax-runner ×1