Apache Felix を使用すると、バンドルを更新するときに ArrayStoreException が発生します。更新されたバンドルとは別のバンドルで発生します。影響を受けるバンドルには、更新されたバンドルによって登録される新しいサービスに反応するサービス リスナーがあります。リスナーは、ArrayStoreException で終わるいくつかのコードを実行します。スタック トレースは次のとおりです。
ERROR: Bundle com.elsten.bliss.platform [47] EventDispatcher: Error during dispatch. (java.lang.ArrayStoreException: com.elsten.bliss.music.policy.tag.tagtype.TagTypePolicy)
java.lang.ArrayStoreException: com.elsten.bliss.music.policy.tag.tagtype.TagTypePolicy
at com.elsten.bliss.main.Main.getPolicies(Main.java:473)
at com.elsten.bliss.main.Main.<init>(Main.java:150)
at com.elsten.bliss.main.Main.startup(Main.java:143)
at com.elsten.bliss.main.Activator$VersionServiceTracker.addingService(Activator.java:58)
at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:906)
at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:234)
at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:941)
at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
at org.apache.felix.framework.Felix.registerService(Felix.java:3275)
at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:352)
at com.elsten.osgi.Activator.start(Activator.java:28)
at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:931)
at org.apache.felix.bundlerepository.impl.ResolverImpl.deploy(ResolverImpl.java:647)
at com.elsten.bliss.updater.OnlineUpdater$2.run(OnlineUpdater.java:100)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:679)
getPolicies (静的メソッド) のコードは、静的最終変数にアクセスします。
private static final MusicPolicy tagTypePolicy = new TagTypePolicy();
private static MusicPolicy[] policies;
private static MusicPolicy[] getPolicies(Version version) {
if(policies==null) {
final HttpClientConfiguration httpClientConfig = HttpClientConfigurations.userAgentAndAcceptGzip(version);
policies = new MusicPolicy[] {
tagTypePolicy
};
}
return policies;
}
私の推測では、これはクラスローディングに関連しています。更新後、MusicPolicy クラスまたは TagTypePolicy クラスが一致しません。なぜこれが当てはまるのか、私は少し混乱しています。これらがプライベートな静的変数であることを考えると、私のコードは好きなことをすることができました。問題が発生する可能性があるのは、スタティックが他のバンドルにエクスポートされたときだけだと思いました。