App Engine、JDO 和 Maven。启动时出错

Posted

技术标签:

【中文标题】App Engine、JDO 和 Maven。启动时出错【英文标题】:App Engine, JDO and Maven. Error on startup 【发布时间】:2013-01-17 13:46:38 【问题描述】:

我正在尝试使用带有 App Engine 和 Maven 配置的 JDO 创建一个简单的测试。

我的编译和数据增强步骤成功。但在运行时(mvn:test 和 appengine:devserver)我得到:

1) Error in custom provider, javax.jdo.JDOFatalInternalException: 
Class "com.google.appengine.datanucleus.DatastoreManager" was not found in the CLASSPATH.
Please check your specification and your CLASSPATH.

但是,我的类路径(target/demo/WEB-INF/lib)确实包含:datanucleus-appengine-2.1.1.jar

而且我的依赖和谷歌datanucleus项目的POM中指定的一样:

  <dependency>
    <groupId>javax.jdo</groupId>
    <artifactId>jdo-api</artifactId>
    <version>3.0.1</version>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>[3.1.1, 3.2)</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-api-jdo</artifactId>
    <version>[3.1.1, 3.2)</version>
  </dependency>
  <dependency>
    <groupId>com.google.appengine.orm</groupId>
    <artifactId>datanucleus-appengine</artifactId>
    <version>2.1.1</version>
  </dependency>

感谢任何建议。

RB

【问题讨论】:

可能与带有datanucleus的JDO版本有冲突。将 datanucleus-core 更改为 3.0 @Sabarish,我尝试了很多版本组合。从 App Engine ORM 项目中引用的那些开始(即 JDO:3.0.1、DataNucleus:[3.1.1,3.2)、ORM:2.1.1):code.google.com/p/datanucleus-appengine/source/browse/branches/…JOD/datanucleus 冲突似乎出现在较早的增强阶段。 所以,this 似乎有正确的信息(很难从 GAE 文档中找到):datanucleus-appengine 2.1.1 需要 org.datanucleus 3.1(并且插件也需要匹配) .但是,现在我有一个不同的构建错误:“类“XXX”不可持久。这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中”。 (mvn datanuclues:enhance 运行良好)。开始浏览冗长的和迄今为止难以理解的日志文件... 【参考方案1】:

我现在一切正常。我想我会分享几个问题(因为我花了好几天的时间来解决所有这些问题):

1)。所有版本都非常重要(尤其是将 App Engine ORM 2.1.1 与 DataNucleus 3.1.1 匹配——包括插件)。

http://www.datanucleus.org/products/accessplatform_3_2/datastores/appengine.html

这就是我最终得到的结果:

  <dependency>
    <groupId>javax.jdo</groupId>
    <artifactId>jdo-api</artifactId>
    <version>3.0.1</version>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>3.1.1</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-api-jdo</artifactId>
    <version>3.1.2</version>
  </dependency>
  <dependency>
    <groupId>com.google.appengine.orm</groupId>
    <artifactId>datanucleus-appengine</artifactId>
    <version>2.1.2</version>
  </dependency>

  ...

  <plugin>
    <groupId>org.datanucleus</groupId>
    <artifactId>maven-datanucleus-plugin</artifactId>
    <version>3.1.2</version>
    <configuration>
      <log4jConfiguration>$basedir/log4j.properties</log4jConfiguration>
      <verbose>false</verbose>
      <fork>false</fork>
    </configuration>
    <executions>
      <execution>
        <phase>process-classes</phase>
        <goals>
          <goal>enhance</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

2)。检查 datanucleus.log 的尾部以确认您的类已增强(通过 mvn datanucleus:enhance)。我最终意识到我的测试类(在 src/test 中)被忽略了。

【讨论】:

code.google.com/p/datanucleus-appengine/wiki/Compatibility 定义了需要哪些版本,结合各种插件的Maven pom.xml;毕竟这就是 pom.xml 依赖项的用途 @rsb:非常感谢您发布您的 pom。到最后我都快疯了。这解决了我的问题。【参考方案2】:

我在 pom.xml 中添加了 false,它对我有用

<plugins>
            <plugin>
                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>3.1.2</version>
                <configuration>
                    **<fork>false</fork>**
                    <log4jConfiguration>$basedir/log4j.properties</log4jConfiguration>
                    <verbose>true</verbose>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

【讨论】:

以上是关于App Engine、JDO 和 Maven。启动时出错的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine、JDO 和 equals/hashCode

Google App Engine (JDO) 中 ID 的 Key 或 Long

为啥 Google App Engine 文档强调 JDO 而不是 JPA?

Google App Engine 的 JDO:转义引号

在哪里使用 JDO/Google App Engine 设置 TransactionOptions?

Google App Engine 上的 JDO 与 JPA for Java