如何使用maven-bundle-plugin中的bnd指令指令?bnd指令以' - '字符开头,这是一个无效的xml标记:
<-foo>bar</-foo>
Run Code Online (Sandbox Code Playgroud)
我已经检查了maven-bundle-plugin 的官方页面,他们说它应该以' - '字符开头:
指令 - 任何以" - "字符开头的指令都被视为指示BND执行某些特殊处理而不会复制到清单的指令.
该包目标的描述似乎并不具备这种信息也是如此.执行一些特殊处理并且不会复制到清单.
我有一个(简单的)maven项目包装类型"捆绑"使用org.apache.felix:maven-bundle-plugin:2.5.4.它产生一个正确的OSGI束罐.但是我观察到所有目标都至少执行了两次.我该如何防止这种情况?问题是某些目标(本例中的checkstyle)很慢,因此重复执行是一个问题.
注意:我从命令行使用maven 3.2.5.
输出或mvn clean install(删除所有不相关的信息).请注意,许多插件执行4次.maven-checkstyle-plugin被执行了两次.
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ my-project ---
[INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-maven) @ my-project ---
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ my-project ---
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ my-project ---
[INFO] --- maven-resources-plugin:2.7:testResources (default-testResources) @ my-project ---
[INFO] --- maven-compiler-plugin:3.3:testCompile (default-testCompile) @ my-project ---
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ my-project ---
[INFO] >>> maven-bundle-plugin:2.5.4:bundle (default-bundle) > package @ my-project >>>
[INFO] --- maven-enforcer-plugin:1.4:enforce (enforce-maven) @ my-project --- …Run Code Online (Sandbox Code Playgroud) 我在Bundle-Classpath上放了一些罐子。下面的行显示了我的pom.xml中的条目,该条目使用Felix插件为捆绑包创建manigest.mf。
<Bundle-ClassPath>.,lib/com.springsource.org.h2-1.0.71.jar,lib/com.springsource.org.apache.lucene-2.3.2.jar,lib/com.springsource.org.apache.lucene.search-2.3.2.jar</Bundle-ClassPath>
Run Code Online (Sandbox Code Playgroud)
这些罐子都有导入包的类,但是从我的看到,它们都具有MANIFEST.MF,它具有自己的(准确的)Import-Package语句列表。
但是,当我构建项目(使用Maven和bundle插件)时,它报告错误,因为它无法解析对某些类的引用。具体的错误是:
Unresolved references to [com.sun.tools.javac, javax.naming, javax.naming.spi, javax.servlet, javax.servlet.http, javax.sql, javax.transaction.xa]
Run Code Online (Sandbox Code Playgroud)
所有这些错误都来自com.springsource.org.h2-1.0.71.jar,所有这些软件包都导入了该jar的清单中。
我无法理解:
关于第二点,我做了一些调查,觉得有一种模式。com.springsource.org.apache.lucene.search-2.3.2.jar在清单中指定的所有导入都由com.springsource.org.apache.lucene-2.3.2.jar满足,该文件也已指定在Bundle-Classpath上。
com.springsource.org.apache.lucene-2.3.2.jar(在Bundle-Classpath上)满足的com.springsource.org.h2-1.0.71.jar依赖项未在错误消息,但是,错误消息中列出了Bundle-Classpath上的jar不满足的那些依赖关系。
不太确定发生了什么。关于Bundle-Classpath中指定的jar文件的规则是什么?是否必须在其主项目的pom中列出其清单的导入(即使在Import-Package中指定了导入)元素?还是这是Maven捆绑插件强制执行的事情?如果是后者,是否有办法摆脱执行?
我有一个捆绑包,使用maven-jaxb2-plugin生成所有要定位到target / generated / src / main / java的类。然后,我使用Maven捆绑包插件创建捆绑包。它只是有效。
现在,我想从此捆绑包中排除(删除)生成的包com.xxx.yyyy.common。所以我用:
<Export-Package>
!com.xxx.yyyy.common,com.xxx.*
</Export-Package>
Run Code Online (Sandbox Code Playgroud)
但是在拥有捆绑包之后,该包裹仍会留在捆绑包内。
是否有计划在 maven-bundle-plugin 中支持“Require-Bundle”,即使它不是推荐的 OSGi 方式。在某些情况下,使用“Require-Bundle”是有意义的,例如合并拆分的包。
我成功地将 OSGi 特定元数据添加到 Flying-saucer-pdf Maven 工件的 MANIFEST 中。但是,我没有成功将该工件的依赖项和传递依赖项嵌入到创建的 JAR 文件中。
我使用来自 GitHub [1] 的 Flying-saucer-pdf 的原始来源,并将以下语句添加到 pom.xml 文件中:
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>process-classes</phase>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Embed-Dependency>itext</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
该工件在其原始 pom.xml 中声明了对 itext 版本 2.1.7 的依赖项,我没有触及该依赖项。我也没有弄乱工件的原始包装类型,即 jar。
不幸的是,这仅完成了部分工作。MANIFEST.MF 似乎正确并且包含预期的 OSGi 标签:
Manifest-Version: 1.0
Bundle-Description: Flying Saucer is a CSS 2.1 renderer written in Jav
a. This artifact supports PDF output.
Bundle-License: http://www.gnu.org/licenses/lgpl.html
Bundle-SymbolicName: org.xhtmlrenderer.flying-saucer-pdf …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个包含REST API和来自定制服务的OSGi WAB的Karaf.然而,由于一些奇怪的原因,OSGi框架抱怨不满意的能力,osgi.component.
我想知道:
osgi.component捆绑?为什么需要?一些其他信息:
一些代码提供其他信息:
整个错误:
执行命令时出错:在bundle上执行命令时出错:启动bundle 96时出错:无法解析com.massimobono.karaf.examples.user-fully-rest [96](R 96.0):缺少需求[com.massimobono.karaf.examples.用户完全休息[96](R 96.0)] osgi.extender; (&(osgi.extender = osgi.component)(版本> = 1.3.0)(!(版本> = 2.0.0)))未解决的要求:[[com.massimobono.karaf.examples.user-fully-rest [ [96 96](R 96.0)] osgi.extender; (&(osgi.extender = osgi.component)(版本> = 1.3.0)(!(版本> = 2.0.0)))]
清单文件:
Manifest-Version: 1.0
Bundle-SymbolicName: com.massimobono.karaf.examples.user-fully-rest
Archiver-Version: Plexus Archiver
Built-By: massi
Bnd-LastModified: 1479908575162
Bundle-ActivationPolicy: lazy
Bundle-ManifestVersion: 2
Import-Package: com.massimobono.karaf.examples.user;version="[0.0,1)",
com.massimobono.karaf.examples.user.service;version="[0.0,1)",javax.w
s.rs;version="[2.0,3)",javax.ws.rs.core;version="[2.0,3)"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
nent)(version>=1.3.0)(!(version>=2.0.0)))",osgi.service;filter:="(obj
ectClass=com.massimobono.karaf.examples.user.service.UserService)";ef
fective:=active,osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.karaf.examples.user.ui.ful
lyrest.UserRest.xml
Tool: Bnd-3.2.0.201605172007
Originally-Created-By: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 opensaml servicemix bundle ( org.apache.servicemix.bundles:org.apache.servicemix.bundles.opensaml:jar:3.2.0_1)在 Apache Karaf (4.0.5) 上运行的 OSGi 包中升级到 OpenSAML 3 。
解析 SAML 的测试正在运行,所以我认为我走在正确的轨道上。但是,如果我安装上Karaf我捆得到一个“资源未找到”当它试图加载错误default-config.xml。
2016-06-21 16:29:10,477 | INFO | ool-120-thread-1 | InitializationService | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Initializing OpenSAML using the Java Services API
2016-06-21 16:29:10,478 | DEBUG | ool-120-thread-1 | InitializationService | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | Initializing module initializer implementation: org.opensaml.core.xml.config.XMLObjectProviderInitializer
2016-06-21 16:29:10,487 | DEBUG | ool-120-thread-1 | XMLConfigurator | 388 - org.apache.servicemix.bundles.opensaml - 3.2.0.1 | …Run Code Online (Sandbox Code Playgroud) 我使用Apache Felix来实现osgi包并将其用作嵌入式Felix框架来调用boundle
这是我的 Maven 插件来构建 MANIFEST.MF :
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.5.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Bundle-Activator>a.b.c.osgi.activator.Activator</Bundle-Activator>
</instructions>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我构建项目,然后在嵌入的 felix 中使用 jar 文件,如下所示
BundleContext bundleContext = f.getBundleContext();
Bundle bundle = bundleContext.installBundle(
"file:/home/eclipse_workSpace/my-module/target/abc-1.1.0.jar");)
String bName = bundle.getLocation();
bundle.getRegisteredServices();
bundle.getState();
/* Bundle[] bls = bundleContext.getBundles(); */
System.out.println("starting bundle " + bName);
bundle.start();
Run Code Online (Sandbox Code Playgroud)
当我开始 Boundle 时,我遇到了这个异常
线程“main”中的异常 org.osgi.framework.BundleException:无法解析 abc [1](R 1.0):缺少要求 [abc [1](R 1.0)] osgi.wiring.package;(&(osgi.wiring.package=com.google.common.base)(version>=21.0.0)(!(version>=22.0.0))) 未解决的要求:[[abc [1](R 1.0) ] osgi.wiring.package;(&(osgi.wiring.package=com.google.common.base)(版本>=21.0.0)(!(版本>=22.0.0)))]
我应该怎么做才能解决这个问题?