我所熟悉的Import-Package和Export-Package,但是这对我来说是一个新的.它有什么作用?
我正在寻找一个循序渐进的指南,使用eclipse bndtools插件将jar转换为OSGi包.我知道可以使用命令行使用bnd来完成它,但很高兴知道如何通过IDE执行相同的操作.
我可能会遗漏一些东西,但本教程仅解释了如何从头开始创建项目.
更新maven-bundle-plugin从版本2.3.5到版本2.4.0运行mvn clean install输出一些警告消息,我不完全理解.例如
Export ch.entwine.weblounge.contentrepository.impl.index, has 1, private references [org.elasticsearch.action.bulk]
我想这与嵌入式lib(elasticsearch)有关.以下是POM的部分内容:
<dependencies>
...
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>0.19.9</version>
</dependency>
...
</dependencies
...
<Export-Package>
...
ch.entwine.weblounge.contentrepository.impl.index
...
</Export-Package>
<Embed-Dependency>
....
elasticsearch;inline=true
...
</Embed-Dependency>
Run Code Online (Sandbox Code Playgroud)
错误消息到底意味着什么?解决此类问题的推荐方法是什么?
花了几个小时,试图了解如何使后持续部署的工作在的情况下,基于OSGi的应用程序,我终于摆在我的计算器的第一个问题,希望对我可能做错了或漏掉某些适应症-不知何故我觉得自己走错了路......
这就是我想要实现的目标:
构建一些bundle并将它们安装到maven存储库(这里没问题,使用bnd)
现在让所有捆绑包组成我的应用程序(通过所有测试等),我想部署并运行应用程序,即使用这些捆绑包启动一些OSGi框架.
开始不是问题 - "mvn pax:provision -Dframework = equinox"可以解决问题.我的应用程序启动jetty,因此很容易通过浏览器验证看起来是否正常(除了所有测试)
但是,现在,尝试"连续",下次我想应用此过程时,我真的应该确保首先关闭我的应用程序的运行实例(至少释放正在使用的端口).所以,为了重新运行一切,我不得不首先关闭旧安装.
这就是我的问题开始的地方:有什么能帮我解决这个问题吗?我知道有maven-deploy-plugin,但这在将一些WAR/EAR文件部署到某个标准应用程序容器中时似乎很有用(似乎不需要重新启动它).
我真的只需要运行一些脚本来启动 OSGi环境 - 然后,下次再将它关闭,然后再重新启动它.使用tomcat,jetty,jboss等,有一些shutdown.sh脚本或mvn jetty:停止指令,但我真的必须自己写这些脚本吗?这是我认为我开始走错路的地方,有人必须在我面前遇到这些问题并解决它们我猜;)
我知道我可以以某种方式尝试使用JMX或使用telnet控制台访问正在运行的实例以发出"stop 0"命令,但这感觉不对.
从jenkins开始的进程应该编译/构建/部署项目,但是我猜不会启动长时间运行的线程,所以我不得不启动一些"外部"进程,我想在下次再次尝试时先杀死它.
有任何想法吗?也许我错过了什么?提前感谢您对此的任何意见!
在大多数情况下,我有很多组件具有由OSGi声明服务注入的相同类.这些服务将用于执行某些逻辑,这些逻辑对于所有派生组件都是相同的.因此,为避免重复代码,最好使用抽象类.是否有可能将DI引用方法(set/unset)移动到抽象类.我正在使用Bnd.
例如:
@Component
public class B implements IA {
private ServiceC sc;
@Reference
public void setServiceC(ServiceC sc) {
this.sc = sc;
}
public void execute() {
String result = executeSomethingDependendOnServiceC();
// do something with result
}
protected String executeSomethingDependendOnServiceC() {
// execute some logic
}
}
@Component
public class D implements IA {
private ServiceC sc;
@Reference
public void setServiceC(ServiceC sc) {
this.sc = sc;
}
public void execute() {
String result = executeSomethingDependendOnServiceC();
// do something different with result …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) 我正在使用maven-bundle-plugin(bnd有效)。
从源中包含资源文件很简单。
例如,在构建期间将资源文件 ( src/main/resources/some.xml) 移动到target目录 ( target/classes/some.xml)下,可以使用以下<Include-Resource>指令将其包含到包中:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.0.1</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Include-Resource>
some.xml=target/classes/some.xml,
</Include-Resource>
</instructions>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
让我们有一个依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>library</artifactId>
<version>1.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
如何在依赖中引用资源文件jar?
换句话说,如何
指定如下内容:
com.example:library:1.0.0:jar/some.xml
Run Code Online (Sandbox Code Playgroud)而不是这个:
target/classes/some.xml
Run Code Online (Sandbox Code Playgroud)所以来自依赖项之一的资源出现在输出包中jar?
我有一个使用ANT和经典BND工具构建的OSGi包.我的bundle在内部使用了一个库(JAR),它在我的OSGi容器(Apache Felix)中不能作为一个包使用.所以,我试图将它嵌入我的包中,以便在运行时访问.
如何使用ANT + BND嵌入这样的库/ JAR?(注意:我不能使用MAVEN,使用它可能会容易得多)
我正在开发一个项目,它是集成项目,我们正在使用Apache Camel和Apache Karaf.在项目中,我需要使用Jira REST Java客户端库.
所以我已经阅读了很多关于如何将非OSGI库包装到OSGI包中的各种文章和线程,但我真的不确定我是否做对了.
所以,我创建了一个POM文件,它依赖于所需的库.制作了一个包并试图将它部署到卡拉夫,当然,卡拉夫抱怨丢失包裹.
所以,我发现了相应的maven依赖,添加它,包进入<Import-Package>和依赖<Embed-Dependency>.
另一轮,部署,找到依赖,添加,再次,再次,直到Karaf与捆绑很好.
这是真的正确吗?在我看来,我觉得很疯狂,所以我想我不会因为usualy :)
最后,包裹变得稳定在我的工作计算机上,我快速检查并回家了,我继续但是,奇怪的是,在我的个人计算机上编译的相同的POM /包不起作用,再次抱怨丢失包裹,但是这次,这个软件包肯定是在POM文件中,并且肯定它是嵌入在包中的,我可以在那里看到它.
这次丢失的包是org.apache.commons.codec.
org.osgi.framework.BundleException: Unresolved constraint in bundle jiraclient.bundle [134]: Unable to resolve 134.0: missing requirement [134.0] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.codec)
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)[org.apache.felix.framework-4.0.3.jar:]
at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1247)[6:org.apache.felix.fileinstall:3.2.6]
at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1219)[6:org.apache.felix.fileinstall:3.2.6]
at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1208)[6:org.apache.felix.fileinstall:3.2.6]
at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:503)[6:org.apache.felix.fileinstall:3.2.6]
at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)[6:org.apache.felix.fileinstall:3.2.6]
Run Code Online (Sandbox Code Playgroud)
所以,现在我完全糊涂了,出了什么问题:(
很高兴,伙计们,帮助我.谢谢!
POM文件很长,所以我想链接更好:http://pastebin.com/j5cmWveG
我有以下的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)
我不希望这个......我没有理由看到它应该是.那么我该如何避免呢?
bnd ×10
osgi ×10
java ×5
apache-felix ×2
ant ×1
apache-camel ×1
bndtools ×1
eclipse ×1
jenkins ×1
maven ×1
osgi-bundle ×1
pax-runner ×1