我在我的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
今天我被问到在我们当前的OSGi应用程序中使用Maven是否是个好主意.我们使用了Bndtools,因为它使开发变得尽可能简单.即使在应用程序运行期间,Bndtools也使用OBR来维护其他捆绑包和依赖项解析.
由于Maven广泛传播并且如此受欢迎,大多数人都尝试在OSGi环境中使用它.对我来说,这是两种不同的方法.OSGi有自己的依赖声明,MANIFEST.MF和Maven是一个pom,你可以在其中声明它们.因此,如果您同时使用它们,则会两次声明依赖项.当然,您可以使用Apache OSGi Maven插件来避免它,Maven负责创建MANIFEST.MF.但Maven存储库并不真正关心捆绑包.因此,您可能会引用非捆绑jar.
当然,使用Maven有一些优点,但将它与OSGi或特别是Bndtools结合起来真的是一件好事吗?
有人可以提供优点或缺点!有使用两者的实际经验吗?
我正在使用eclipse bndtools插件来开发基于OSGi的Web应用程序。我正在使用Eclipse IDE(由于bndtools)和Jetbrain Webstorm IDE来编辑html / css / js文件。
当我在eclipse中更改文件时,bndtools刷新了包,并且可以立即看到更改,但是当我使用Webstorm编辑文件时,我需要在eclipse中刷新项目才能查看结果。
注意:我已启用Eclipse工作区设置Windows>首选项>常规>工作区>使用本机钩子或轮询进行轮询,并在访问时进行刷新 。但这只会使eclipse在我访问eclipse中的文件时能够检测到更改。
为了加快开发速度,我不想在Webstorm中所做的每一次更改都使用eclipse刷新项目。我问是否有办法避免这种情况。
谢谢
我是OSGI的新手,我在尝试创建WAB时遇到很多问题.我正在使用BndTools和Eclipse帮助我使用OSGi.我现在的问题是如何将JSF与OSGi集成.我想制作一个主Web服务器,并添加带有jsf页运行时的包.我怎样才能做到这一点?有什么需求?
提前致谢!
我有以下的bnd文件:
Bundle-Version: 1.0.12
Bundle-Activator: a.b.Activator
Private-Package: a.b
-buildpath: osgi.core;version=4.3.0,\
org.apache.felix.bundlerepository;version=1.6.6,\
osgi.cmpn;version=4.3.0.201111022214
-sources: false
Run Code Online (Sandbox Code Playgroud)
在生成的MANIFEST.MF中:
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
Run Code Online (Sandbox Code Playgroud)
我不希望这个......我没有理由看到它应该是.那么我该如何避免呢?
我正在使用BndTools(http://bndtools.org/)来开发OSGI应用程序.一切都很好,但我想在导出我的应用程序时想要改变一些东西.
我正在努力实现两件事(我认为它们可能是相关的):
aQute.launcher
自定义的BndTools启动器替换默认的BndTools启动器(或者将其.JAR
格式化)如何摆脱或更改默认的BndTools启动器(aQute.launcher)到自定义的启动器?
我在这个主题上唯一能找到的就是:http://goo.gl/jYliih
发射器没有构建成bnd,实际的发射策略是参数化的.启动器通过在其上放置JAR与bnd或bndrun文件相关联
-runpath
.A.JAR
应该有一个Launcher-Plugin标头作为启动器.如果未找到启动器,-runpath
则将使用内置启动器biz.aQute.launcher
.
原因是我需要我的应用程序接受命令args而不是干扰aQute启动器(就像所有-run args).另一方面,我想摆脱.bat/.sh
启动应用程序的批处理方法,并使用单个.jar
文件来启动应用程序.
那可能吗?
默认情况下,BndTools在导出应用程序时会创建此文件结构:
jar/
- >这是OSGI jar包文件夹
aQute/
- >默认的BndTools Launcher(Launcher.class里面)
META-INF/
- >为什么这里有META-INF文件夹?这不是JAR
launcher.properties
- >启动器属性
start.sh
- >从这个批处理文件中启动Launcher.class.
start.bat
/与JAR相比,这有什么好处?
基本上,我想删除aQute
,META-INF
和start.*
文件,并添加一个bin
文件夹的二进制文件.
这应该可以用"Ant","Maven"或"Gridle"脚本来实现.但我可以创建一个没有BndTools支持的"BndTools项目"或"Gradle项目".我安装了"BndTools Gradle插件",但我找不到任何有关此主题的有用文档.
希望有人可以帮助我,或者指出我正确的方向.问候.
我正在从使用 Embed-Dependency 提供“方便”配置的 maven-bundle-plugin 迁移,但似乎我需要在使用bnd-maven-plugin
. 我从旧包中添加了相同的包头,但它似乎没有包含实际依赖项的 jar 文件。有人有快速/简洁的方法吗?
我创建了一个依赖于 SLF4J 的包,因此我使用 Logback 来实现 OSGI。这一切都捆绑起来并安装正常,但是当我开始捆绑时,出现以下异常:
org.osgi.framework.BundleException:无法解析 com.felix.test [20](R 20.0):缺少要求 [com.felix.test [20](R 20.0)] osgi.wiring.package;(osgi.wiring.package=groovy.lang) 未解决的需求:[[com.felix.test [20](R 20.0)] osgi.wiring.package; (osgi.wiring.package=groovy.lang)]
我可以看到我的清单文件中groovy.lang
列出了Import-Package
,我很确定问题是 Logback 已被嵌入,但它的引用都没有。
我用来创建捆绑包,这是配置:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.4</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Import-Package>
*
</Import-Package>
<Embed-Dependency>
*
</Embed-Dependency>
<Embed-Directory>
osgi-inf/libs
</Embed-Directory>
<Embed-Transitive>
true
</Embed-Transitive>
</instructions>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这是我的清单:
Manifest-Version: 1.0
Bnd-LastModified: 1436982944102
Build-Jdk: 1.8.0_45
Built-By: tim.clifford
Bundle-ClassPath: .,osgi-inf/libs/org.osgi.core-1.0.0.jar,osgi-inf/libs/
servlet-api-2.5.jar,osgi-inf/libs/org.apache.felix.scr.annotations-1.9.
6.jar,osgi-inf/libs/httpclient-osgi-4.5.jar,osgi-inf/libs/httpclient-4.
5.jar,osgi-inf/libs/httpcore-4.4.1.jar,osgi-inf/libs/commons-logging-1.
2.jar,osgi-inf/libs/commons-codec-1.9.jar,osgi-inf/libs/httpmime-4.5.ja
r,osgi-inf/libs/httpclient-cache-4.5.jar,osgi-inf/libs/fluent-hc-4.5.ja
r,osgi-inf/libs/ehcache-2.10.0.jar,osgi-inf/libs/slf4j-api-1.7.7.jar,os
gi-inf/libs/commons-lang3-3.4.jar,osgi-inf/libs/logback-classic-1.1.3.j
ar,osgi-inf/libs/logback-core-1.1.3.jar
Bundle-ManifestVersion: 2
Bundle-Name: com.felix.test
Bundle-SymbolicName: com.felix.test
Bundle-Version: 1.0.0.SNAPSHOT
Created-By: Apache Maven Bundle …
Run Code Online (Sandbox Code Playgroud) 我有以下问题:我的日食氧气无法运行(错误附加).当我在下载后运行它(在9月1日和12月2日测试)时,一切都很好.但是,当我重新启动计算机时,除非重新安装,否则eclipse不会重新启动.我已经清除了eclipse缓存和我的项目一样(甚至从repo获取了新版本),工作区和eclipse安装位置也很新鲜.我已阅读如https://bugs.eclipse.org/bugs/show_bug.cgi?id=475392,https://bugs.eclipse.org/bugs/show_bug.cgi?id=514895和其他相关的帖子,没"尽管如此.任何的想法?我正在使用Windows 10 64位和JDK 9.0.1 + 11.我唯一的插件是BndTools 3.5,最新的,项目需要java 8(当前运行时jdk是152).在运行我的项目并同时在示例bnd项目(http://enroute.osgi.org/tutorial_base/600-testing.html)上解决依赖关系后的星期五开始出现问题.之后无法运行eclipse.但是,我之前做过,并没有遇到任何问题(我的意思是打开示例并运行它).另外,我已经清除了p2,mvn和bnd缓存.
来自eclipse .log的下面提到的堆栈:
!SESSION 2017-12-18 16:47:57.660 -----------------------------------------------
eclipse.buildId=4.7.2.M20171123-0800
java.version=9.0.1
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=pl_PL
Framework arguments: -product org.eclipse.epp.package.java.product
Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product
!ENTRY org.eclipse.osgi 4 0 2017-12-18 16:47:59.711
!MESSAGE Application error
!STACK 1
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:4533)
at org.eclipse.swt.SWT.error(SWT.java:4448)
at org.eclipse.swt.SWT.error(SWT.java:4419)
at org.eclipse.swt.widgets.Display.error(Display.java:1263)
at org.eclipse.swt.widgets.Display.checkDevice(Display.java:767)
at org.eclipse.swt.widgets.Display.addListener(Display.java:628)
at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.<init>(IDEWorkbenchAdvisor.java:187)
at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.<init>(IDEWorkbenchAdvisor.java:195)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at …
Run Code Online (Sandbox Code Playgroud) 我正在研究这个基于 BndTools 的 OSGi 项目:https : //github.com/Jafre13/ISS-Product
我的项目虽然需要一个基于非 OSGi 的库(aliasi-lingpipe - https://mvnrepository.com/artifact/de.julielab/aliasi-lingpipe/4.1.0)。
这就是问题开始的地方。首先,我尝试直接从 Maven 存储库中添加 JAR,因为 BndTools 据称与 Maven 存储库兼容,但它似乎不适用于“存储库浏览器”。即使将 Maven Central 插件添加到http://bnd.bndtools.org/plugins/maven.html 中所述的 build.bnd 文件,仍然会产生相同的结果。
放弃让 Maven 工作,我尝试以最简洁的方式来做,自己下载 JAR 并将其添加为此处指定的普通 JAR:http : //bndtools.org/faq.html(6 How Can I Depend on a构建时的普通 JAR 文件?)
这次 JAR 得到了识别,我可以开始在代码中使用它。但是一旦你启动了 OSGi 框架,当它试图解析非 OSGi 类路径时,一切都会再次崩溃,导致如下接线错误:
无法解析包:[slf4j.api-1.7.25 org.osgi.framework.BundleException: 无法解析 slf4j.api [6](R 6.0): 缺少需求 [slf4j.api [6](R 6.0)] osgi.wiring.package; (&(osgi.wiring.package=org.slf4j.impl)(version>=1.6.0)) 未解决的需求:[[slf4j.api [6](R 6.0)] osgi.wiring.package; (&(osgi.wiring.package=org.slf4j.impl)(version>=1.6.0))] , dk.sdu.sso.sred-0.0.0.201712041036 org.osgi.framework.BundleException: 无法解析 dk。 sdu.sso.sred [7](R 7.0): …
在我的工作场所,他们让我学习 OSGi 框架并决定使用它的最佳方法是什么。
在过去的两周里,我在网上冲浪,发现了很多使用 OSGi 的不同方法,例如,我发现了 OSGi enRoute 方法和一个名为 BndTools 的 Eclipse 插件。我发现我可以简单地使用声明式服务或像 AIOLOS 这样的框架。
我对所有这些不同的方法和技术感到有些困惑……对于初学者来说,您认为开始使用 OSGi 的最佳方法是什么?是否有比其他实现更好的实现(例如 Equinox)?您有使用此框架的首选方法吗?
非常感谢您提前!
我终于完成了将我的应用程序的一部分移动到 osgi 包中并在我的主机应用程序中使用这些包。这真的很好用!
目前,我正在使用 bndtools 清理我的 eclipse 工作区并消除警告。
我无法摆脱的一个警告是:
Eclipse: The .classpath contains an unknown container: org.eclipse.jdt.USER_LIBRARY/lombok
Run Code Online (Sandbox Code Playgroud)
我在我的一些包中使用 lombok。我只是将它添加到项目属性 > java 构建路径 > 库选项卡中。很好用,因为 lombok 是一个用于 eclipse 编译时的库。但这里的问题是我确实收到了上述警告。
我在本地 bndtools 存储库(存储库视图)中添加了一些外部 jar(带有捆绑信息),然后可以将这些 jar 添加到 bndtools 构建路径中,例如 gson。
但是 lombok 似乎没有任何 osgi bundle 信息,因此将其添加到本地存储库会给我一个错误“Jar 没有符号名称”。
当然我可以编辑 lombok.jar 并添加包信息。但我想知道是否有更清洁的方法来做到这一点?
bndtools ×12
osgi ×10
java ×7
bnd ×3
apache-felix ×2
apache-karaf ×1
bundle ×1
eclipse ×1
enroute ×1
java-9 ×1
jsf ×1
lombok ×1
maven ×1
osgi-bundle ×1
pax-runner ×1
wab ×1
webstorm ×1