java-无法开始嵌入Apache Felix
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-无法开始嵌入Apache Felix,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5156字,纯文字阅读大概需要8分钟。
内容图文
![java-无法开始嵌入Apache Felix](/upload/InfoBanner/zyjiaocheng/677/c56c09e66a8940f4a6fc4b898c63193a.jpg)
我想基于Apache Felix Framework创建Java桌面应用程序.我创建了这个主要的Java类:
package test.main;
import test.activator.Activator;
import java.util.ServiceLoader;
import java.util.HashMap;
import java.util.Map;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.launch.FrameworkFactory;
/**
* This class provides a static {@code main()} method so that the bundle can be
* run as a stand-alone host application. In such a scenario, the application
* creates its own embedded OSGi framework instance and interacts with the
* internal extensions to providing drawing functionality. To successfully
* launch the stand-alone application, it must be run from this bundle's
* installation directory using "{@code java -jar}". The locations of any
* additional extensions that have to be started, have to be passed as command
* line arguments to this method.
*/
public class StartApplication
{
private static Framework m_framework = null;
public static Map<Integer, String> map = new HashMap<Integer, String>();
/**
* Enables the bundle to run as a stand-alone application. When this static
* {@code main()} method is invoked, the application creates its own
* embedded OSGi framework instance and interacts with the internal
* extensions to provide drawing functionality. To successfully launch as a
* stand-alone application, this method should be invoked from the bundle's
* installation directory using "{@code java -jar}". The location of any
* extension that shall be installed can be passed as parameters.
* <p>
* For example if you build the bundles inside your workspace, maven will
* create a target directory in every project. To start the application from
* within your IDE you should pass:
* <p>
*
* <pre>
* {@code file:../servicebased.circle/target/servicebased.circle-1.0.0.jar
* file:../servicebased.square/target/servicebased.square-1.0.0.jar
* file:../servicebased.triangle/target/servicebased.triangle-1.0.0.jar}
* </pre>
*
* @param args The locations of additional bundles to start.
*
*/
public static void main(String[] args)
{
map.put(1, "/opt/bundle1.jar");
// map.put(2, "test value 2");
// map.put(3, "test value 3");
// Args should never be null if the application is run from the command
// line.
// Check it anyway.
//String[] locations = args != null ? args : new String[0];
// Print welcome banner.
System.out.println("\nWelcome to My Launcher");
System.out.println("======================\n");
try
{
Map<String, String> config = ConfigUtil.createConfig();
m_framework = createFramework(config);
m_framework.init();
m_framework.start();
installAndStartBundles();
m_framework.waitForStop(0);
System.exit(0);
}
catch (Exception ex)
{
System.err.println("Could not create framework: " + ex);
ex.printStackTrace();
System.exit(-1);
}
}
/**
* Util method for creating an embedded Framework. Tries to create a
* {@link FrameworkFactory} which is then be used to create the framework.
*
* @param config the configuration to create the framework with
* @return a Framework with the given configuration
*/
private static Framework createFramework(Map<String, String> config)
{
ServiceLoader<FrameworkFactory> factoryLoader = ServiceLoader
.load(FrameworkFactory.class);
for (FrameworkFactory factory : factoryLoader)
{
return factory.newFramework(config);
}
throw new IllegalStateException(
"Unable to load FrameworkFactory service.");
}
/**
* Installs and starts all bundles used by the application. Therefore the
* host bundle will be started. The locations of extensions for the host
* bundle can be passed in as parameters.
*
* @param bundleLocations the locations where extension for the host bundle
* are located. Must not be {@code null}!
* @throws BundleException if something went wrong while installing or
* starting the bundles.
*/
private static void installAndStartBundles() throws BundleException, Exception
{
BundleContext bundleContext = m_framework.getBundleContext();
Activator hostActivator = new Activator();
hostActivator.start(bundleContext);
for (String location : map.values())
{
Bundle addition = bundleContext.installBundle(location);
addition.start();
}
}
}
当我运行jar文件时,出现此错误:
[rcbandit@Laptop target]$java -jar ./DX-57-1.0.jar
Welcome to My Launcher
======================
Exception in thread "main" java.lang.NoClassDefFoundError: org/osgi/framework/launch/FrameworkFactory
at dx57.main.StartApplication.createFramework(StartApplication.java:95)
at dx57.main.StartApplication.main(StartApplication.java:71)
Caused by: java.lang.ClassNotFoundException: org.osgi.framework.launch.FrameworkFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 2 more
您能告诉我如何解决这个问题吗?
解决方法:
您需要在应用程序类路径上有一个OSGi框架,例如菲利克斯例如,您应按以下方式启动:
java -cp DX-57-1.0.jar;org.apache.felix.framework-4.2.1.jar test.main.StartApplication
内容总结
以上是互联网集市为您收集整理的java-无法开始嵌入Apache Felix全部内容,希望文章能够帮你解决java-无法开始嵌入Apache Felix所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。