我正在尝试编写一个基于 OSGi 的桌面应用程序。我有一个 Swing JFrame,我想增加添加模块(其他包)的可能性。我走过EclipseZone OSGi at JSig tutorial ,但每个应用程序都是从 OSGi 框架(在本例中为 Knopflerfish OSGi 桌面)启动的。
所以我的问题是,是否有一个选项可以在没有可见 OSGi 框架的情况下启动应用程序?我知道,从代码中可以更改 bundle 的属性,但是如何以这种方式更改框架的属性? (例如,默认包存储位置、包在位时的默认操作等?)
public class MainFrame extends ServiceTracker implements BundleActivator {
public MainFrame(BundleContext context, JToolBar toolBar) {
// select, which services is the bundle tracking
super(context, JMenu.class.getName(), null);
}
@Override
public void start(BundleContext context) throws Exception {
//display a JFrame
}
@Override
public void stop(BundleContext context) throws Exception {
//hide a JFrame
}
@Override
public Object addingService(ServiceReference reference) {
// Process a Service and return a JMenu
return new JMenu();
}
@Override
public void removedService(ServiceReference reference, Object service) {
// remove a JMenu from a JFrame
}
public static void main(String[] args) {
// ????????????????????????????????????????????
// ????????????????????????????????????????????
}
}
我在上面写了一个类(我只发布了一个草图),但我不知道在 main() 函数中写什么。这个包在 Knopflerfish OSGi Desktop 中运行良好,但我希望它在没有它的情况下运行。
最佳答案
您的代码基本上没问题,但听起来您想对 OSGi 框架本身进行更多控制。换句话说,您想知道如何启动 OSGi 框架并启动您的包。您目前遇到的问题是您正在使用其他人的启动器(Knopflerfish 启动器),其中包括 KF GUI 控制台,并且您正在使用它来安装和启动您的包。然而,这些都不是必需的。
在 AValchev 的回答中,他谈到了使用 java -jar org.eclipse.osgi.jar -console
启动 Equinox。这种方法的问题在于它给了你一个空 OSGi 框架,所以你必须在 OSGi shell 中键入命令才能安装和启动你的包……这也不理想!
我认为您应该编写自己的启动器。这实际上非常简单,可以通过完全独立于任何特定 OSGi 框架实现的方式来完成。我在 blog post 中写过这个不久前。
在伪代码中,您的启动器应用程序应如下所示:
public static void main() {
1. get a FrameworkFactory using java.util.ServiceLoader.
2. create an OSGi framework using the FrameworkFactory
3. start the OSGi framework
4. Install your bundle(s).
5. Start all the bundles you installed.
6. Wait for the OSGi framework to shutdown.
}
在您的问题中,您特别询问了有关设置包存储位置的问题。这可以通过在传递给 FrameworkFactory.newFramework
方法的 Map 中设置 Constants.FRAMEWORK_STORAGE
属性来完成。
关于java - 在桌面独立应用程序中使用 OSGi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518837/