使用GAE / Java运行DataNucleus JPA的问题

时间:2014-06-05 10:24:47

标签: java google-app-engine jpa datanucleus

我现在在使用App Engine时遇到了一些问题,执行mvn clean install时出现的错误是:

[INFO] Changes detected - recompiling the module!                                                                                                  
[INFO] Compiling 4 source files to /home/codio/workspace/target/classes                                                                            
[INFO]                                                                                                                                             
[INFO] --- maven-datanucleus-plugin:3.1.1:enhance (default) @ demo-boot ---                                                                     
[INFO] 2014-06-05 10:16:55.791  INFO   --- [           main] DataNucleus.Enhancer                     : DataNucleus Enhancer for API "JPA"         
2014-06-05 10:16:56.118  INFO   --- [           main] DataNucleus.Enhancer                     : DataNucleus Enhancer (version 3.1.1) : Enhancement
 of classes                                                                                                                                        
DataNucleus Enhancer (version 3.1.1) : Enhancement of classes                                                                                      
2014-06-05 10:16:56.226  WARN   --- [           main] DataNucleus.MetaData                     : Metadata file -enhancerName not found in CLASSPATH
2014-06-05 10:16:56.226  WARN   --- [           main] DataNucleus.MetaData                     : Metadata file ASM not found in CLASSPATH          

[ERROR] --------------------                                                                                                                       
[ERROR]  Standard error from the DataNucleus tool + org.datanucleus.enhancer.DataNucleusEnhancer :                                                 
[ERROR] --------------------                                                                                                                       
[ERROR] Exception in thread "main" java.lang.NoSuchMethodError: org.datanucleus.metadata.MetaDataManager.getOMFContext()Lorg/datanucleus/OMFContext
;                                                                                                                                                  
        at org.datanucleus.jpa.metadata.JPAAnnotationReader.processClassAnnotations(JPAAnnotationReader.java:199)                                  
        at org.datanucleus.metadata.annotations.AbstractAnnotationReader.getMetaDataForClass(AbstractAnnotationReader.java:126)                    
        at org.datanucleus.metadata.annotations.AnnotationManagerImpl.getMetaDataForClass(AnnotationManagerImpl.java:171)                          
        at org.datanucleus.metadata.MetaDataManager.loadAnnotationsForClass(MetaDataManager.java:2650)                                             
        at org.datanucleus.metadata.MetaDataManager.loadClasses(MetaDataManager.java:496)                                                          
        at org.datanucleus.enhancer.DataNucleusEnhancer.getFileMetadataForInput(DataNucleusEnhancer.java:734)                                      
        at org.datanucleus.enhancer.DataNucleusEnhancer.enhance(DataNucleusEnhancer.java:525)                                                      
        at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1258)   

pom.xml是这样的:

<groupId>org.demo</groupId>
<artifactId>demo-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>demo-boot</name>
<description>Demo project</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.0.BUILD-SNAPSHOT</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-legacy</artifactId>
        <version>1.1.0.BUILD-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>net.kindleit</groupId>
        <artifactId>gae-runtime</artifactId>
        <version>${gae.version}</version>
        <type>pom</type>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
            <!-- Spring Data -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.6.0.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
        <version>1.6.0.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-rest-webmvc</artifactId>
        <version>2.1.0.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <!--<version>${org.springframework-version}</version>-->
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-labs</artifactId>
        <version>${gae.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-stubs</artifactId>
        <version>${gae.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-testing</artifactId>
        <version>${gae.version}</version>
        <scope>test</scope>
    </dependency>
    <!-- DataNucleus -->
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-jpa</artifactId>
        <version>2.1.8</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-api-jpa</artifactId>
        <version>${datanucleus.jpa.version}</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-core</artifactId>
        <version>${datanucleus.jpa.version}</version>
    </dependency>
    <dependency>
        <groupId>org.datanucleus</groupId>
        <artifactId>datanucleus-enhancer</artifactId>
        <version>${datanucleus.jpa.version}</version>
    </dependency>
    <dependency>
        <groupId>com.google.appengine.orm</groupId>
        <artifactId>datanucleus-appengine</artifactId>
        <version>2.1.2</version>
        <!-- Need to exclude the enhancer since it interfere with the enhancer plugin. -->
        <exclusions>
            <exclusion>
                <groupId>org.datanucleus</groupId>
                <artifactId>datanucleus-enhancer</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>javax.jdo</groupId>
        <artifactId>jdo-api</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.geronimo.specs</groupId>
        <artifactId>geronimo-jpa_2.0_spec</artifactId>
        <version>1.1</version>
    </dependency>
</dependencies>

<properties>
    <start-class>demo.Application</start-class>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.7</java.version>
    <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
    <datanucleus.jpa.version>3.1.1</datanucleus.jpa.version>
    <gae.version>1.8.8</gae.version>
    <gae.home>${settings.localRepository}/com/google/appengine/appengine-java-sdk/${gae.version}/appengine-java-sdk/appengine-java-sdk-${gae.version}</gae.home>
    <gae.application.version>test</gae.application.version>
    <!--<org.springframework-version>4.0.5.RELEASE</org.springframework-version>-->
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>net.kindleit</groupId>
            <artifactId>maven-gae-plugin</artifactId>
            <version>0.9.6</version>
            <dependencies>
                <dependency>
                    <groupId>net.kindleit</groupId>
                    <artifactId>gae-runtime</artifactId>
                    <version>${gae.version}</version>
                    <type>pom</type>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-maven-plugin</artifactId>
            <version>${gae.version}</version>
            <configuration>
                <enableJarClasses>false</enableJarClasses>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-release-plugin</artifactId>
            <configuration>
                <goals>gae:deploy</goals>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat6-maven-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <path>/</path>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.datanucleus</groupId>
            <artifactId>maven-datanucleus-plugin</artifactId>
            <version>${datanucleus.jpa.version}</version>
            <configuration>
                <api>JPA</api>
                <mappingIncludes>**/entity/*.class</mappingIncludes>
                <verbose>true</verbose>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.datanucleus</groupId>
                    <artifactId>datanucleus-core</artifactId>
                    <version>${datanucleus.jpa.version}</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<profiles>
    <!-- We can configure our integration server to activate this profile and 
        perform gae:deploy, thus uploading latest snapshot to the http://1.latest.<applicationName>.appspot.com 
        automatically -->
    <profile>
        <id>integration-build</id>
        <properties>
            <gae.application.version>stage</gae.application.version>
        </properties>
    </profile>

    <!-- This profile will activate automatically during release and upload 
        application to the http://2.latest.<applicationName>.appspot.com (We might 
        want to set the 2nd version as our applications Default version to be accessible 
        at http://<applicationName>.appspot.com) -->
    <profile>
        <id>release-build</id>
        <activation>
            <property>
                <name>performRelease</name>
                <value>true</value>
            </property>
        </activation>

        <properties>
            <!-- During release, set application version in appengine-web.xml to 
                2 -->
            <gae.application.version>release</gae.application.version>
        </properties>
    </profile>
</profiles>

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>http://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>http://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

完成Codio项目:http://bit.ly/1i53oAq

2 个答案:

答案 0 :(得分:1)

尝试以下依赖项

<!--
    persistence
    App Engine and DataNucleus compatibility:
    https://code.google.com/p/datanucleus-appengine/wiki/Compatibility
-->
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>javax.persistence</artifactId>
    <version>2.1.0</version>
    <scope>compile</scope>
</dependency>    

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>3.2.15</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-api-jpa</artifactId>
    <version>3.1.3</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>javax.jdo</groupId>
    <artifactId>jdo-api</artifactId>
    <version>3.1</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-jodatime</artifactId>
    <version>3.2.1</version>
    <scope>compile</scope>
</dependency>

对于gradle,

    // persistence
    // App Engine and DataNucleus compatibility:
    // https://code.google.com/p/datanucleus-appengine/wiki/Compatibility
    compile 'org.eclipse.persistence:javax.persistence:2.1.0'
    runtime 'org.datanucleus:datanucleus-core:3.2.15'
    compile 'org.datanucleus:datanucleus-api-jpa:3.1.3'
    compile 'javax.jdo:jdo-api:3.1'
    compile 'org.datanucleus:datanucleus-jodatime:3.2.1'

答案 1 :(得分:0)

为什么你使用非常陈旧且不一致的罐子?

jar“datanucleus-jpa”太旧了,它在很长一段时间内都没有被使用过AFAIK(所有API罐都是datanucleus-api-XXX的形式并且已经存在了很长时间)。 也许退一步并使用一致的东西将是一个开始。谷歌在这里为GAE JPA(你正在使用的)定义罐子。 https://code.google.com/p/datanucleus-appengine/wiki/Compatibility