2014-01-21 63 views
0

我试图让datanucleus管理我的谷歌应用程序引擎Java应用程序中的谷歌云表格。datanucleus谷歌云sql,缺少org.datanucleus.store.rdbms.RDBMSStoreManager

可悲的是,我收到以下错误信息:

org.datanucleus.exceptions.ClassNotResolvedException: Class 
"org.datanucleus.store.rdbms.RDBMSStoreManager" was not found 
in the CLASSPATH. Please check your specification and your CLASSPATH. 

但是,让我们一起去的顺序。这里是我的jdoconfig.xml

<?xml version="1.0" encoding="utf-8"?> 
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd"> 

<persistence-manager-factory name="transactions-optional"> 
    <property name="javax.jdo.PersistenceManagerFactoryClass" 
     value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" /> 
    <property name="javax.jdo.option.ConnectionURL" value="appengine" /> 
    <property name="javax.jdo.option.NontransactionalRead" 
     value="true" /> 
    <property name="javax.jdo.option.NontransactionalWrite" 
     value="true" /> 
    <property name="javax.jdo.option.RetainValues" value="true" /> 
    <property name="datanucleus.appengine.autoCreateDatastoreTxns" 
     value="false" /> 
    <prop key="javax.jdo.option.Multithreaded">true</prop> 
    <property name="datanucleus.cache.level2" value="true" /> 
    <property name="datanucleus.cache.level2.type" value="none"/> 

    <property name="datanucleus.cache.level1.type" value="soft"/> 
    <property name="datanucleus.appengine.storageVersion" 
       value="READ_OWNED_CHILD_KEYS_FROM_PARENTS"/> 
</persistence-manager-factory> 

<persistence-manager-factory name="cloud-sql"> 
    <property name="javax.jdo.PersistenceManagerFactoryClass" 
     value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" /> 
    <property name="javax.jdo.option.ConnectionDriverName" 
     value="com.mysql.jdbc.GoogleDriver"/> 
    <property name="javax.jdo.option.ConnectionUserName" value="root"/> 
    <property name="datanucleus.autoCreateSchema" value="true"/> 
</persistence-manager-factory> 
</jdoconfig> 

两个持久化管理工厂的声明是一个用于应用程序引擎非关系数据存储,一个是谷歌云SQL。

构建我的SQLManager期间抛出异常。构造函数的状态

@Inject 
public SQLManager(final NamedQueryProvider queryProvider) { 
    super(queryProvider); 
    final Map<String, String> properties = new HashMap(); 
    properties.put("javax.jdo.option.ConnectionURL", getConnectionUrl()); 
    pmFactory = JDOHelper.getPersistenceManagerFactory(properties, 
      "cloud-sql"); 
} 

你可以说:你必须错过classpath中的必需jar。然而,在我的pom.xml有

<dependency> 
    <groupId>org.datanucleus</groupId> 
    <artifactId>datanucleus-accessplatform-jdo-rdbms</artifactId> 
    <version>3.3.4</version> 
    <type>pom</type> 
</dependency> 
<dependency> 
    <groupId>org.datanucleus</groupId> 
    <artifactId>datanucleus-rdbms</artifactId> 
    <version>3.2.8</version> 
</dependency> 

第二赝实际上是不必要的,因为由第一扔了进去。我已将它作为初始解决方法,但它不起作用。

任何人都有类似的想法?似乎没有关于datanucleus + jdo + cloud sql的文档,但是因为我正在使用它来访问GAE数据存储,所以我想重复使用它用于cloud sql。

编辑

这里是堆栈跟踪的相关部分。不幸的是,我无法在登录时看到哪些jar应用引擎正在寻找。

Class "org.datanucleus.store.rdbms.RDBMSStoreManager" was not found in the CLASSPATH. 
Please check your specification and your CLASSPATH. 
org.datanucleus.exceptions.ClassNotResolvedException: Class 
"org.datanucleus.store.rdbms.RDBMSStoreManager" was not found in the CLASSPATH. Please 
check your specification and your CLASSPATH. 
at org.datanucleus.JDOClassLoaderResolver.classForName(JDOClassLoaderResolver.java:245) 
at org.datanucleus.plugin.NonManagedPluginRegistry.createExecutableExtension(NonManagedPluginRegistry.java:679) 
at org.datanucleus.plugin.PluginManager.createExecutableExtension(PluginManager.java:290) 
at org.datanucleus.NucleusContext.createStoreManagerForProperties(NucleusContext.java:410) 
at org.datanucleus.NucleusContext.initialise(NucleusContext.java:280) 
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:591) 
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:326) 
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:256) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115) 
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1965) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.jdo.JDOHelper.invoke(JDOHelper.java:1960) 
at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1128) 
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808) 
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:1093) 
at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:960) 
at com.mycompany.myproduct.mypackage.SQLManager.<init>(SQLManager.java:24) 
+0

有人使用真正的MySQL JDBC驱动程序的各种职位https://stackoverflow.com/questions/19718226/how-do-i-get-the-datanucleus-schematool-working-with-google-cloudsql有显然有很多关于DataNucleus + RDBMS + JDO的文档,这就是google-cloud-sql声称的(不是我使用它,只是阅读他们的营销;-) – DataNucleus

+0

看起来像标准的mysql jdbc驱动程序是为应用程序运行的应用程序引擎(请参阅您的链接中的答案#2)。尽管有谷歌的文档建议,但我会试着去查看它是否可以正常工作,但是我不会很高兴激活(并支付)静态IP,只是因为他们的GoogleDriver不工作... – p91paul

+0

类路径是足够简单的事情来调试,并且该异常有一个堆栈跟踪(某处),它告诉你它来自哪里。日志还会告诉您尝试创建PMF时处理的是哪些罐子。那些应该是你的关键调试区域 – DataNucleus

回答

1

问题是datanucleus jar版本不匹配。

我在版本3.0使用datanucleus-core,datanucleus-api-jdo等。*,而datanucleus-rdbms 3.2。我删除了datanucleus-accessplatform-jdo-rdbms依赖项,因为我意识到我不需要它带来的所有jar,并且将datanucleus-rdbms降级到3.0.10版本。 (看起来像datanucleus-appengine插件尚不支持3.2系列,这就是为什么我喜欢升级降级)。

现在我可以连接到云sql很好。