2012-07-08 174 views
1

我有一个OSGi应用程序,它可以从命令行启动并正常运行。然而,在生产环境中,这个应用程序必须从用C编写的小程序启动。这个程序检查许可证,执行其他的东西,并用我的应用程序使用JNI启动Java虚拟机。就这样,我从log4j的有奇怪的错误和休眠(我已经启用了-verbose:类JVM标志):OSGi和JNI的类加载问题

[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 [[email protected]] whereas object of type 
log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [[email protected]]. 
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) 

为什么这些类加载两次?为什么他们中的一些从Felix加载,一些是从Java classloader加载的?我怀疑某些本地代码在OSGi应用程序启动之前调用了java(例如日志记录),并且这些加载的类以某种方式重复使用导致ClassCastExceptions - 我该如何证明或反驳这一点?

回答

0

问题出在程序启动器内部。它将所有捆绑包添加到JVM的类路径中,但只需要Felix jar。