我们正在尝试一个简单的用例,使用来自 Karaf 内部 Camel 路由的 JPA 读取/写入 mysql 数据库。当骆驼加载包含路由的代码时,这经常/总是导致以下堆栈跟踪:
2013-07-19 17:01:47,178 | 警告 | ft.WorkoutEntity | Jpa消费者 | rg.apache.camel.util.CamelLogger 224 | 68 - org.apache.camel.camel-core - 2.10.4 | Consumer Consumer[jpa://WorkoutEntity] 轮询端点失败:Endpoint[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.DBDictionary.endConfiguration(DBDictionary.java:4712) 中的 org.apache.openjpa.lib.conf 中的 apache.openjpa.jdbc.sql.SQLErrorCodeReader.parse(SQLErrorCodeReader.java:107)。 org.apache.openjpa.lib.conf.Configurations 中的 Configurations.configureInstance(Configurations.java:518)。
XMLFactory 包含在我的包已导入的 OpenJPA 聚合包中。我什至可以从同一个 org.apache.openjpa.lib.xml 包中实例化其他对象。
我破解了开源 OpenJPA 代码并查看了 XMLFactory。加载类时应调用顶部的静态块。静态块看起来并不复杂,只是实例化了 SAX 和 DOM 解析器工厂。
如果在包含路由的 java 代码中,我添加以下行:
org.apache.openjpa.lib.xml.XMLFactory.getClass()
在 ClassLoader 中加载类,错误有时会停止。
这是一些版本信息:
卡拉夫 => 2.3.2
骆驼 => 试过 2.10.4 和 2.11.1
OpenJPA => 试过 2.2.0 和 2.2.2
mysql => 5.1.25
如果您需要更多信息,请告诉我。
-新信息-我从karaf 提示符打开了调试级别日志记录,现在在 NoClassDefError 之前看到此错误
2013-07-19 17:35:36,784 | 调试 | ft.WorkoutEntity | 交易模板 | tion.support.TransactionTemplate 160 | 75 - org.springframework.transaction - 3.2.3.RELEASE | 在应用程序异常 javax.xml.parsers.FactoryConfigurationError 上启动事务回滚:在 javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:122)[:2.2.0] 处找不到提供程序 org.apache.xerces.jaxp.SAXParserFactoryImpl 在 org.apache.openjpa.lib.xml.XMLFactory.(XMLFactory.java:60) 在 org.apache.openjpa.jdbc.sql.SQLErrorCodeReader.parse(SQLErrorCodeReader.java:107) 在 org.apache.openjpa.jdbc。 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:100) 在 org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:199) .openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:603)
这解释了 NoClassDefFound 错误。