在OSGi包中添加第三方maven依赖项的最佳方法

时间:2013-08-27 21:58:05

标签: java osgi osgi-bundle

我刚开始使用OSGI开发,并且正在努力了解处理依赖/第三方JAR或maven依赖项的最佳方法。

即。如果我正在创建一个捆绑,那么我可能会使用一些第三方JAR。当我创建我的捆绑JAR以部署到OSGI时,显然这些第三方JAR不包括在内,因此捆绑包不会运行。

我知道一个选项是将这些JAR转换为捆绑包,并将它们部署到OSGI容器中。但我不能为我将要使用的每一个maven依赖都这样做。

处理这种情况的最佳解决方案是什么?有什么办法可以直接将jar文件嵌入到bundle中吗?

下面是我的java主应用程序,它启动OSGi框架,然后尝试安装一个依赖于Log4j的简单包。在未来,我还可以拥有其他第三方maven依赖...

public class OSGiTest {

    private static Framework framework;

    public static void main(String[] args) {

        try {
            FileUtils.deleteDirectory(new File("felix-cache"));
            FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();

            framework = frameworkFactory.newFramework(new HashMap<String, String>());
            framework.start();

            installAndStartBundle("DependencyBundle", "1.0.0");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (BundleException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void installAndStartBundle(final String name, final String version) throws BundleException, Exception {

        final String basePath = "S:\\maven.repo\\dependency\\DependencyBundle\\1.0.0";
        final BundleContext bundleContext = framework.getBundleContext();
        final List<Bundle> installedBundles = new LinkedList<Bundle>();

        BundleActivator b = new org.ops4j.pax.url.mvn.internal.Activator();
        b.start(bundleContext);

        String filename = name + ModelConstants.DASH + version + ModelConstants.DOTJAR;
        String localFilename = ModelConstants.FILE_PROTOCOL + basePath+ File.separatorChar + filename;

        installedBundles.add(bundleContext.installBundle(localFilename));

        for (Bundle bundle : installedBundles) {
            bundle.start();
        }
    }
}

下面是我的OSGi包{1}}的pom.xml文件 -

DependencyBundle

1 个答案:

答案 0 :(得分:1)

如果你刚刚开始,为什么要通过管理框架运行时的复杂性来深入挖掘?

采用更简单,可以说更短的路线,并从预构建运行时开始,例如Apache Karaf,您只需使用pax-url项目的maven url handler from the command line安装捆绑包,您也可以使用wrap: protocol为依赖项动态添加有效的OSGi清单。

一旦你知道自己在做什么,那么你就可以了解并建立自己的。