我刚开始使用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
答案 0 :(得分:1)
如果你刚刚开始,为什么要通过管理框架运行时的复杂性来深入挖掘?
采用更简单,可以说更短的路线,并从预构建运行时开始,例如Apache Karaf,您只需使用pax-url项目的maven url handler from the command line安装捆绑包,您也可以使用wrap: protocol为依赖项动态添加有效的OSGi清单。
一旦你知道自己在做什么,那么你就可以了解并建立自己的。