Knopflerfish,在bundle中使用外部库

时间:2013-02-26 08:59:01

标签: java osgi knopflerfish

我知道在OSGI包中有两种使用外部库的方法。由于只有我的包需要lib(例如google-gson),我试图将它放在Bundle-ClassPath(manifest.mf)中。但每当我在Knopflerfish中运行捆绑包时,我得到Exception in thread "Thread-74" [stderr] java.lang.NoClassDefFoundError: com/google/gson/Gson

由于我是OSGI的新手,我尝试按照here创建捆绑包的说明使用build.xml进行编译,其中我也包含了lib(不知道这是否正确)。因此,该库出现在三个不同的位置,项目类路径 bundle classpath (manifest.mf)和 build.xml

如果有人能给我一个如何使图书馆工作的提示,我会很高兴的。提前谢谢!

2 个答案:

答案 0 :(得分:1)

过程如下

1.将所有.jar个文件及其相关内容复制到文件夹

2.在BUNDLE-CLASSPATH的{​​{1}}中提及。{参考this

3.将此库中的重新添加到MANIFEST.MF中的Export-package元素,以使其对其他包可见。

希望这可以解决您的问题

答案 1 :(得分:0)

可能对我有用的几点提示:

  • 捆绑的MANIFEST.MF可能有from django.views.generic import CreateView, UpdateView from my_app.forms import ProductCreateForm from my_app.models import Product from django.contrib.auth.models import User class ProductCreate(CreateView): """Simple CreateView to create a Product with ForeignKey relation to User""" model = Product form_class = ProductCreateForm template = 'product_create.html' def form_valid(self, form): user = User.objects.filter(username=form.cleaned_data['user_email']).first() if user is None: messages.error("Invalid user email specified") return some http response here... #How to I render the page again, but with the data already in the #form we don't have to re-enter it all? form.save() messages.info("Successfully saved the product!") return some http response here... #How do I redirect to the UpdateView here with the Product instance #already in the form? class ProductUpdate(UpdateView): model = Product form_class = ProductCreateForm template = 'product_create.html' 之类的行。在该行中,您应该从库中添加所需包的导入,因此它仍为Import-Package: org.osgi.framework
  • 正如TheWhiteRabbit在答案中所说,库应该有一个像Import-Package: org.osgi.framework, com.google.gson这样的导出行,所以其他捆绑包可能会看到它。已经编译和打包的库通常已经设置好了,但是我找到了一些没有经过检查的库。

还要记住,可以将外部库安装到框架中,就好像它是捆绑包一样,即在init.xargs Export-Package: its.sec.api.service 已安装但未启动

希望这有帮助