来自Karaf内部的org.apache.openjpa.lib.xml.XMLFactory中的NoClassDefFoundError

时间:2013-07-19 17:21:13

标签: java osgi apache-camel openjpa

我们正在尝试使用来自Karaf内部的Camel路由的JPA来读取/写入mysql数据库的简单用例。当camel加载包含路由的代码时,这经常/总是导致以下堆栈跟踪:

  

2013-07-19 17:01:47,178 |警告| ft.WorkoutEntity | JpaConsumer | rg.apache.camel.util.CamelLogger 224 | 68 - org.apache.camel.camel-core - 2.10.4 |消费者消费者[jpa:// WorkoutEntity]轮询终点失败:端点[jpa:// WorkoutEntity]。将在下次投票时再试一次。引起:[java.lang.NoClassDefFoundError - 无法初始化类org.apache.openjpa.lib.xml.XMLFactory]   java.lang.NoClassDefFoundError:无法初始化类org.apache.openjpa.lib.xml.XMLFactory       在org.apache.openjpa.jdbc.sql.SQLErrorCodeReader.parse(SQLErrorCodeReader.java:107)       在org.apache.openjpa.jdbc.sql.DBDictionary.endConfiguration(DBDictionary.java:4712)       在org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:518)       在org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:443)       在org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:199)       at org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:100)

XMLFactory包含在我的bundle已导入的OpenJPA聚合包中。我甚至可以从同一个org.apache.openjpa.lib.xml包中实例化其他对象。

我破解了openource OpenJPA代码并查看了XMLFactory。顶部有一个静态块,应该在加载类时调用。静态块看起来并不复杂,只是实例化SAX和DOM解析器工厂。

如果在我的包含路由的java代码中添加以下行:

  

org.apache.openjpa.lib.xml.XMLFactory.getClass()

要在ClassLoader中加载类,错误 有时 将停止。

以下是一些版本信息:

Karaf => 2.3.2

Camel =>试过2.10.4和2.11.1

OpenJPA =>试过2.2.0和2.2.2

Mysql => 5.1.25

如果您需要更多信息,请与我们联系。

- 新信息 - 我从karaf提示符启用了DEBUG级别日志记录,现在在NoClassDefError之前看到此错误

  

2013-07-19 17:35:36,784 |调试| ft.WorkoutEntity | TransactionTemplate | tion.support.TransactionTemplate 160 | 75 - org.springframework.transaction - 3.2.3.RELEASE |在应用程序异常上启动事务回滚   javax.xml.parsers.FactoryConfigurationError:找不到 提供程序org.apache.xerces.jaxp.SAXParserFactoryImpl           在javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:122)[:2.2.0]           在org.apache.openjpa.lib.xml.XMLFactory。(XMLFactory.java:60)           在org.apache.openjpa.jdbc.sql.SQLErrorCodeReader.parse(SQLErrorCodeReader.java:107)           在org.apache.openjpa.jdbc.sql.DBDictionary.endConfiguration(DBDictionary.java:4712)           在org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:518)           在org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:443)           在org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:199)           在org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:100)           在org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:603)

这解释了NoClassDefFound错误。

1 个答案:

答案 0 :(得分:0)

您可能没有安装过Xerces。

尝试从maven安装它及其依赖项:

osgi:install wrap:mvn:xml-apis/xml-apis/1.4.01
osgi:install wrap:mvn:xml-resolver/xml-resolver/1.2
osgi:install wrap:mvn:xerces/xercesImpl/2.11.0