Struts2 OSGi プラグインがどのように機能するかを確認しようとしているので、このブログ投稿で提供されているテスト アプリケーションをデプロイすることから始めました。問題のトラブルシューティングを改善するために、WEB-INF/classes/bundles/2 フォルダーからすべてのバンドルを削除し、一度に 1 つずつ追加してみました。私が直面している問題は次のとおりです。
(1) MyOsgi.jar バンドル (BundleActivator を実装するクラスを 1 つだけ含む空のバンドル) を含めようとすると、アプリケーションのデプロイ中に次のエラーが発生します。
| | org.apache.felix.framework.Felix.createBundleActivator(Felix.java:3548)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix._startBundle(Felix.java:1666)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.startBundle(Felix.java:1588)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で 3548)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=スレッド-2;| org.apache.felix.framework.Felix._startBundle(Felix.java:1666)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.startBundle(Felix.java:1588)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で 3548)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=スレッド-2;| org.apache.felix.framework.Felix._startBundle(Felix.java:1666)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.startBundle(Felix.java:1588)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で felix.framework.Felix._startBundle(Felix.java:1666)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun. enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.startBundle(Felix.java:1588)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で felix.framework.Felix._startBundle(Felix.java:1666)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun. enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.startBundle(Felix.java:1588)|#] [#|2013-01-07T18:32:14.513+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.Felix.setFrameworkStartLevel(Felix.java:1180)|#] で
[#|2013-01-07T18:32:14.514+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:265)|#]
[#|2013-01-07T18:32:14.514+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.std で.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-2;| java.lang.Thread.run(Thread.java:722)|#] で
これによると、上記のエラーは、JVM に複数の BundleActivator クラスがロードされているという事実によるものです。これは、それを含む felix.jar が既に GlassFish で利用可能であり、多くの felix jar がアプリケーションに含まれているためです。 Struts2 OSGi プラグインの依存関係として。プラグインからフェリックスの依存関係を除外しようとしましたが (Maven を使用してアプリケーションをビルドしています)、依存関係として含まれているフェリックス jar には、felix.jar に存在しない他のクラスも含まれているため、これは機能しません。
(2) struts2-osgi-demo-bundle-2.3.1 バンドルを含めようとすると、まったく別のエラーが発生し、何が原因かわかりません。
[#|2013-01-07T18:30:02.897+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=42;_ThreadName=Thread-2;| WebModule[/osgi]PWC1270: フィルター struts2 java.lang.LinkageError を開始する際の例外: ローダーの制約違反: ローダー (org/apache/felix/framework/searchpolicy/ContentClassLoader のインスタンス) は、以前に「org/osgi」という名前の別のタイプの読み込みを開始しました/framework/BundleContext" の java.lang.Class.getDeclaredMethods0(Native Method) の java.lang.Class.privateGetDeclaredMethods(Class.java:2442) の java.lang.Class.privateGetPublicMethods(Class.java:2562) の java. lang.Class.getMethods(Class.java:1427) org.apache.struts2.convention.PackageBasedActionConfigBuilder.getActionAnnotations(PackageBasedActionConfigBuilder.java:792) org.apache.struts2.Convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:605) org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:335) org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) org.apache.struts2.osgi.OsgiConfigurationProvider.loadConfigFromBundle(OsgiConfigurationProvider.java:146) で org.apache.struts2.osgi.OsgiConfigurationProvider.loadPackages(OsgiConfigurationProvider.java:96) で com.opensymphony.xwork2.config.impl.DefaultConfiguration org.apache.struts2.dispatcher.Dispatcher の com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) の .reloadContainer(DefaultConfiguration.java:215)。init_PreloadConfiguration(Dispatcher.java:390) org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:436) org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69) org .apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:264) org.apache.catalina.core.ApplicationFilterConfig (ApplicationFilterConfig.java:120) org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4685) で org.apache.catalina.core.StandardContext.start(StandardContext.java:5377) で com.sun .enterprise.web.WebModule.start(WebModule.java:498) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917) org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901) org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733) com.sun.enterprise.web.WebContainer .loadWebModule(WebContainer.java:2019) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1669) at com.sun.enterprise.web.WebApplication.start(WebApplication.java:109) at org. org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) の glassfish.internal.data.EngineRef.start(EngineRef.java:130) org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo. java:301) com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) で com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) で org.glassfish .deployment.admin.DeployCommand.execute(DeployCommand.java:389) com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348) com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand (CommandRunnerImpl.java:363) com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085) com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95) com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291) com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259) com.sun .enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461) com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212) com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call( ContainerMapper.java:354) com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) com .sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter .java:229) com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) で com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) で com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) で com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask) .java:54) com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) で com.sun.grizzly.ContextTask.run(ContextTask.java:71) で com.sun.grizzly.util.AbstractThreadPool$ Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) |#]com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) の doCall(ProtocolChainContextTask.java:54) com.sun.grizzly.ContextTask.run(ContextTask.java:71) の com.sun.grizzly.util .AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) | #]com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) の doCall(ProtocolChainContextTask.java:54) com.sun.grizzly.ContextTask.run(ContextTask.java:71) の com.sun.grizzly.util .AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722) | #]
struts2-osgi-demo-bundle-2.3.1 バンドルに BundleActivator クラスがないことに気付きました。これが前のエラーが発生しない理由だと思いますが、これは解決策を見つけるのに役立ちません.
最後に、両方のバンドルを含むアプリケーションを問題なく Tomcat にデプロイできます。これにより、両方の問題は GlassFish の felix.jar の存在に関係しているという結論に至りました。
GlassFish で Struts2 OSGi プラグインを使用したことがある人、またはこれらの問題を克服する方法を知っている人はいますか?
更新:上記の 2 番目のエラーは、BundleContextAware を実装するバンドルに含まれる BundlesAction クラスが原因で発生します。プラグインのドキュメントによると、プラグインは OSGi インターセプターを定義します。
アクションをチェックし、org.apache.struts2.osgi.interceptor.BundleContextAware を実装している場合は、アクションで setBundleContext(BundleContext bundleContext) を呼び出し、OSGi コンテナーの BundleContext を渡します。
私が推測しているのは、問題の始まりです。
更新 2: Lukasz と Tang が示唆しているように、更新された Felix バージョンを使用し、(おそらく) 新しいものを開始する代わりに、GlassFish で既に利用可能な OSGi ランタイムを使用するには、プラグインを更新する必要があります。これに関して、次の質問があります。
- 同じアプリケーション サーバーに 2 つの OSGi ランタイムを配置することは可能ですか。プラグインはサーバーの OSGi ランタイムを無視して独自に起動できますか (もちろん、クラスパスに Felix クラスの複数のバージョンが含まれないように、GlassFish と同じ Felix バージョンを使用するように更新されていると仮定します)?
- GlassFish の OSGi ランタイムを使用するには、プラグインはそれへの参照を取得する必要があります。これは、OSGi バンドルとしてデプロイされていない Web アプリケーションで実行できますか? はいの場合、どのように?