コマンドラインから起動して正常に動作するOSGiアプリケーションがあります。ただし、本番環境では、このアプリケーションは C で記述された小さなプログラムから開始する必要があります。このプログラムは、ライセンスをチェックし、他の処理を行い、私のアプリケーションで JNI を使用して Java 仮想マシンを開始します。このようにして、log4j と休止状態から奇妙なエラーが発生しました (-verbose:class JVM フラグを有効にしました)。
[Loaded org.apache.log4j.Appender from reference:file:/opt/dc/lib/log4j-1.2.15.jar]
[Loaded org.apache.log4j.Appender from file:/opt/dc/lib/log4j-1.2.15.jar]
...
[Loaded org.apache.log4j.RollingFileAppender from file:/opt/dc/lib/log4j-1.2.15.jar]
log4j:ERROR A "org.apache.log4j.RollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@eafb71] whereas object of type
log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@1cde100].
log4j:ERROR Could not instantiate appender named "ROLLINGFILE".
...
[Loaded org.dom4j.DocumentFactory from reference:file:/opt/dc/lib/dom4j-1.6.1.jar]
...
[Loaded org.dom4j.DocumentFactory from file:/opt/dc/lib/dom4j-1.6.1.jar]
...
java.lang.ClassCastException: org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory
at org.dom4j.DocumentFactory.getInstance(DocumentFactory.java:97)
at org.dom4j.io.DOMReader.<init>(DOMReader.java:38)
at org.hibernate.util.XMLHelper.createDOMReader(XMLHelper.java:69)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1615)
at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1218)
これらのクラスが 2 回読み込まれるのはなぜですか? それらの一部が Felix からロードされ、一部が Java クラスローダーからロードされるのはなぜですか? OSGi アプリケーションが開始される前に一部のネイティブ コードが Java (ロギングなど) を呼び出し、それらのロードされたクラスが何らかの形で再利用されて ClassCastExceptions を引き起こしている疑いがあります。これを証明または反証するにはどうすればよいですか?