未找到 OSGI 激活器 class
OSGI Activator class not found
我正在尝试制作最简单的 OSGI 示例,以查看它是否适用于特定的 Java 虚拟机。目前我正在使用 Open JDK 1.8.0.
对其进行测试
我正在学习 this 教程。我有完全相同的文件,只是我从 .java 文件和清单中删除了 package 语句(我只是想让它更简单)。
基本上清单看起来像这样:
Bundle-Name: Service listener example
Bundle-Description: A bundle that displays messages at startup and when service events occur
Bundle-Vendor: Apache Felix
Bundle-Version: 1.0.0
Bundle-Activator: Activator
Import-Package: org.osgi.framework
我能够生成 jar 文件。内容如下:
" zip.vim version v27
" Browsing zipfile /home/cosmin/OSGI_Testing/osgi/test.jar
" Select a file with cursor and press ENTER
META-INF/
META-INF/MANIFEST.MF
build/Activator.class
我 运行 Apache Felix,我安装了 .jar 文件,当我启动它时抛出异常:
ERROR: Bundle [1] Error starting file:/home/cosmin/OSGI_Testing/osgi/. /test.jar (org.osgi.framework.BundleException: Not found: Activator)
java.lang.ClassNotFoundException: Activator not found by [1]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1610)
at org.apache.felix.framework.BundleWiringImpl.access0(BundleWiringImpl.java:80)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1404)
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4505)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2220)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2145)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1372)
at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
有什么问题?
恭敬地感谢您。
我认为 Activator-class 不应该在构建文件夹中。删除构建文件夹。
这里面有几个问题。 Activator class 位于错误的文件夹中......但已经提到过。除此之外,您应该始终在 OSGi 中使用包名称。特别是稍后当你想共享包时,你必须确保同一个包不会在多个 jar 中使用。
您似乎是手动创建清单。这是一个非常容易出错的过程。我建议使用 maven 构建并使用 maven-bundle-plugin 或 bnd-maven-plugin 生成清单。这样就安全多了。
你可以看看into a tutorial I did some time ago。也许您需要根据您的情况将其剥离,但您会看到 Maven 构建。
第一次尝试使用 Activator 是个好主意.. 但您随后应该快速切换到依赖注入框架。对于 OSGi,我建议研究声明式服务。
我正在尝试制作最简单的 OSGI 示例,以查看它是否适用于特定的 Java 虚拟机。目前我正在使用 Open JDK 1.8.0.
对其进行测试我正在学习 this 教程。我有完全相同的文件,只是我从 .java 文件和清单中删除了 package 语句(我只是想让它更简单)。
基本上清单看起来像这样:
Bundle-Name: Service listener example
Bundle-Description: A bundle that displays messages at startup and when service events occur
Bundle-Vendor: Apache Felix
Bundle-Version: 1.0.0
Bundle-Activator: Activator
Import-Package: org.osgi.framework
我能够生成 jar 文件。内容如下:
" zip.vim version v27
" Browsing zipfile /home/cosmin/OSGI_Testing/osgi/test.jar
" Select a file with cursor and press ENTER
META-INF/
META-INF/MANIFEST.MF
build/Activator.class
我 运行 Apache Felix,我安装了 .jar 文件,当我启动它时抛出异常:
ERROR: Bundle [1] Error starting file:/home/cosmin/OSGI_Testing/osgi/. /test.jar (org.osgi.framework.BundleException: Not found: Activator)
java.lang.ClassNotFoundException: Activator not found by [1]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1610)
at org.apache.felix.framework.BundleWiringImpl.access0(BundleWiringImpl.java:80)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1404)
at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4505)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:2220)
at org.apache.felix.framework.Felix.startBundle(Felix.java:2145)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1372)
at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
有什么问题?
恭敬地感谢您。
我认为 Activator-class 不应该在构建文件夹中。删除构建文件夹。
这里面有几个问题。 Activator class 位于错误的文件夹中......但已经提到过。除此之外,您应该始终在 OSGi 中使用包名称。特别是稍后当你想共享包时,你必须确保同一个包不会在多个 jar 中使用。
您似乎是手动创建清单。这是一个非常容易出错的过程。我建议使用 maven 构建并使用 maven-bundle-plugin 或 bnd-maven-plugin 生成清单。这样就安全多了。
你可以看看into a tutorial I did some time ago。也许您需要根据您的情况将其剥离,但您会看到 Maven 构建。
第一次尝试使用 Activator 是个好主意.. 但您随后应该快速切换到依赖注入框架。对于 OSGi,我建议研究声明式服务。