Datanucleus для Google Cloud SQL, отсутствует org.datanucleus.store.rdbms.RDBMSStoreManager

Я пытаюсь заставить datanucleus управлять своими SQL-таблицами Google Cloud в Java-приложении Google App Engine.

К сожалению, я получаю следующее сообщение об ошибке:

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>

Два объявления сохраняемого менеджера-фабрики - одно для нереляционного хранилища данных ядра приложения, другое - для облака Google 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");
}

Вы можете сказать: вы должны пропустить необходимую банку с пути к классу. Тем не менее, в моем 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.

РЕДАКТИРОВАТЬ

Вот соответствующая часть трассировки стека. К сожалению, я не могу увидеть в журнале, что ищет движок приложения jars.

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)

1 ответ

Решение

Проблема заключалась в несовпадении версий jat datanucleus.

Я использовал datanucleus-core, datanucleus-api-jdo и т. Д. В версии 3.0.*, А datanucleus-rdbms 3.2. Я удалил зависимость datanucleus-accessplatform-jdo-rdbms, так как понял, что мне не нужны все jar-файлы, которые он вводит, и понизил версию datanucleus-rdbms до версии 3.0.10. (Похоже, что плагин datanucleus-appengine еще не поддерживает 3.2 серии, поэтому я предпочел понизить версию, а не обновить).

Теперь я могу подключиться к облаку SQL нормально.

Другие вопросы по тегам