标签: bndtools

OSGi和传递依赖

我在我的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

13
推荐指数
1
解决办法
2835
查看次数

与Maven,OSGi和Bndtools合作

今天我被问到在我们当前的OSGi应用程序中使用Maven是否是个好主意.我们使用了Bndtools,因为它使开发变得尽可能简单.即使在应用程序运行期间,Bndtools也使用OBR来维护其他捆绑包和依赖项解析.

由于Maven广泛传播并且如此受欢迎,大多数人都尝试在OSGi环境中使用它.对我来说,这是两种不同的方法.OSGi有自己的依赖声明,MANIFEST.MF和Maven是一个pom,你可以在其中声明它们.因此,如果您同时使用它们,则会两次声明依赖项.当然,您可以使用Apache OSGi Maven插件来避免它,Maven负责创建MANIFEST.MF.但Maven存储库并不真正关心捆绑包.因此,您可能会引用非捆绑jar.

当然,使用Maven有一些优点,但将它与OSGi或特别是Bndtools结合起来真的是一件好事吗?

有人可以提供优点或缺点!有使用两者的实际经验吗?

java osgi maven bndtools

10
推荐指数
1
解决办法
4572
查看次数

Eclipse立即检测外部文件更改

我正在使用eclipse bndtools插件来开发基于OSGi的Web应用程序。我正在使用Eclipse IDE(由于bndtools)和Jetbrain Webstorm IDE来编辑html / css / js文件。

当我在eclipse中更改文件时,bndtools刷新了包,并且可以立即看到更改,但是当我使用Webstorm编辑文件时,我需要在eclipse中刷新项目才能查看结果。

注意:我已启用Eclipse工作区设置Windows>首选项>常规>工作区>使用本机钩子或轮询进行轮询,并在访问时进行刷新 。但这只会使eclipse在我访问eclipse中的文件时能够检测到更改。

为了加快开发速度,我不想在Webstorm中所做的每一次更改都使用eclipse刷新项目。我问是否有办法避免这种情况。

谢谢

java eclipse osgi webstorm bndtools

6
推荐指数
1
解决办法
1294
查看次数

OSGI和JSF如何协同工作?

我是OSGI的新手,我在尝试创建WAB时遇到很多问题.我正在使用BndTools和Eclipse帮助我使用OSGi.我现在的问题是如何将JSF与OSGi集成.我想制作一个主Web服务器,并添加带有jsf页运行时的包.我怎样才能做到这一点?有什么需求?

提前致谢!

jsf osgi bundle bndtools wab

6
推荐指数
1
解决办法
1383
查看次数

在bndtools中,是什么原因导致生成执行环境的Require-Capability标头?

我有以下的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)

我不希望这个......我没有理由看到它应该是.那么我该如何避免呢?

osgi bnd bndtools

6
推荐指数
1
解决办法
2524
查看次数

如何替换BndTools默认启动器并更改导出文件结构

我正在使用BndTools(http://bndtools.org/)来开发OSGI应用程序.一切都很好,但我想在导出我的应用程序时想要改变一些东西.

我正在努力实现两件事(我认为它们可能是相关的):

1:用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文件来启动应用程序.

那可能吗?

2:自定义导出的文件结构

默认情况下,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-INFstart.*文件,并添加一个bin文件夹的二进制文件.

这应该可以用"Ant","Maven"或"Gridle"脚本来实现.但我可以创建一个没有BndTools支持的"BndTools项目"或"Gradle项目".我安装了"BndTools Gradle插件",但我找不到任何有关此主题的有用文档.

希望有人可以帮助我,或者指出我正确的方向.问候.

java osgi bnd bndtools osgi-bundle

5
推荐指数
1
解决办法
412
查看次数

如何使用 bnd-maven-plugin 嵌入 maven 依赖项

我正在从使用 Embed-Dependency 提供“方便”配置的 maven-bundle-plugin 迁移,但似乎我需要在使用bnd-maven-plugin. 我从旧包中添加了相同的包头,但它似乎没有包含实际依赖项的 jar 文件。有人有快速/简洁的方法吗?

osgi bnd maven-bundle-plugin blueprint-osgi bndtools

5
推荐指数
1
解决办法
2143
查看次数

OSGI 捆绑包依赖项

我创建了一个依赖于 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)

java osgi apache-felix maven-bundle-plugin bndtools

4
推荐指数
1
解决办法
8466
查看次数

Eclipse Oxygen无法运行 - org.eclipse.swt.SWTException:无效的线程访问

我有以下问题:我的日食氧气无法运行(错误附加).当我在下载后运行它(在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 java-9 eclipse-oxygen

2
推荐指数
1
解决办法
1392
查看次数

BndTools,如何添加非 OSGi JAR?使用普通 JAR 破坏了整个项目。缺少需求接线包

我正在研究这个基于 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): …

java osgi bndtools

2
推荐指数
1
解决办法
366
查看次数

如何开始使用 OSGi

在我的工作场所,他们让我学习 OSGi 框架并决定使用它的最佳方法是什么。

在过去的两周里,我在网上冲浪,发现了很多使用 OSGi 的不同方法,例如,我发现了 OSGi enRoute 方法和一个名为 BndTools 的 Eclipse 插件。我发现我可以简单地使用声明式服务或像 AIOLOS 这样的框架。

我对所有这些不同的方法和技术感到有些困惑……对于初学者来说,您认为开始使用 OSGi 的最佳方法是什么?是否有比其他实现更好的实现(例如 Equinox)?您有使用此框架的首选方法吗?

非常感谢您提前!

java osgi declarative-services bndtools enroute

2
推荐指数
1
解决办法
1060
查看次数

带有 lombok 的 Bndtools“包含一个未知容器”

我终于完成了将我的应用程序的一部分移动到 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 并添加包信息。但我想知道是否有更清洁的方法来做到这一点?

java osgi lombok bndtools

1
推荐指数
1
解决办法
449
查看次数