2014-01-21 115 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很好。