2017-09-04 1 views
0

Je veux ajouter un fragment d'OSGI à un faisceau, ici à « org.eclipse.equinox.http.jetty », avec un Manifest.mf comme celui-ci:OSGI: En utilisant du code dans un autre paquet à partir d'un fragment

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: JettyCustomize 
Bundle-SymbolicName: com.company.st.console.jetty.customize 
Bundle-Version: 1.0.0.qualifier 
Bundle-Vendor: Company 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 
Fragment-Host: org.eclipse.equinox.http.jetty 

Malheureusement, mon code nécessite du code défini dans d'autres bundles, ici dans "org.eclipse.jetty.io". J'ajoute donc la ligne suivante au manifeste:

Import-Package: org.eclipse.jetty.io 

maintenant - dans Eclipse - le code compile. Mais quand je commence l'application, je reçois l'exception suivante (MyJettyCustomizer est une classe dans le fragement qui est utilisé par le code dans le fragment-hôte "org.eclipse.equinox.http.jetty" par réflexion):

java.lang.ClassNotFoundException: com.company.st.console.jetty.customize.MyJettyCustomizer cannot be found by org.eclipse.equinox.http.jetty_3.4.0.v20170503-2025 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:484) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:395) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:387) 
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:150) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at org.eclipse.equinox.http.jetty.internal.HttpServerManager.createJettyCustomizer(HttpServerManager.java:232) 
    at org.eclipse.equinox.http.jetty.internal.HttpServerManager.updated(HttpServerManager.java:74) 
    at org.eclipse.equinox.http.jetty.internal.Activator.start(Activator.java:62) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:779) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:772) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:729) 
    at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:933) 
    at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) 
    at org.eclipse.osgi.container.Module.doStart(Module.java:581) 
    at org.eclipse.osgi.container.Module.start(Module.java:449) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1628) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1608) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1579) 
    at org.eclipse.osgi.container.SystemModule.startWorker(SystemModule.java:264) 
    at org.eclipse.osgi.container.Module.doStart(Module.java:581) 
    at org.eclipse.osgi.container.Module.start(Module.java:449) 
    at org.eclipse.osgi.container.SystemModule.start(SystemModule.java:188) 
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:383) 
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:402) 
    at org.eclipse.osgi.launch.Equinox.start(Equinox.java:115) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:326) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:239) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1499) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1472) 

Si je supprime le code qui a besoin de "org.eclipse.jetty.io" de MyJettyCustomizer et supprime à nouveau la ligne "Import-Package: org.eclipse.jetty.io" du manifeste, il n'y a pas d'exception à l'exécution et la classe MyJettyCustomizer est correctement chargée.

Alors est-il possible que je puisse utiliser le code d'un autre paquet dans un fragment OSGI?

Répondre

0

Avez-vous le package com.company.st.console.jetty.customize dans plusieurs ensembles/fragments? Cela ressemble à un problème de paquets divisés!