5

私はappengineを初めて使用し、appengineバージョン1.8.7(1.8.6でも起こります)を使用し、プロジェクトにmavenを追加しようとしています。

エンティティを永続化すると、ログは次のようになります。

[INFO] nov 07, 2013 5:38:33 PM com.google.appengine.api.datastore.dev.LocalDatastoreService init
[INFO] INFO: Local Datastore initialized:
[INFO]  Type: High Replication
[INFO]  Storage: D:\Projects\JEE\myapp\tmp\local_db.bin
[INFO] nov 07, 2013 5:38:33 PM com.google.appengine.api.datastore.dev.LocalDatastoreService load
[INFO] INFO: The backing store, D:\Projects\JEE\myapp\tmp\local_db.bin, does not exist. It will be created.

私の問題は、local_db.bin が作成されていないことです。たとえば、永続化されたエンティティを検索しようとすると、エラーが表示されます。

[INFO] java.lang.IllegalArgumentException: Type com.harriague.myapp.dao.entities.Travel is not a known entity type
[INFO]  at org.datanucleus.api.jpa.metamodel.MetamodelImpl.entity(MetamodelImpl.java:193)

...

これは私のエンティティクラスです:

package com.harriague.myapp.dao.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Column;

import com.google.appengine.api.datastore.Key;

@Entity(name = "Travel")
public class Travel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key travelId;

    @Column(name = "name")
    private String name;

    public Travel() {

    }

    public Key getTravelId() {
        return travelId;
    }

    public void setTravelId(Key travelId) {
        this.travelId = travelId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

mi pom.xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>

    <groupId>com.harriague</groupId>
    <artifactId>myapp</artifactId>


    <properties>
        <appengine.app.version>1</appengine.app.version>
        <appengine.target.version>1.8.7</appengine.target.version>
        <datanucleus-core.version>3.1.3</datanucleus-core.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Compile/runtime dependencies -->
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-1.0-sdk</artifactId>
            <version>${appengine.target.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-endpoints</artifactId>
            <version>${appengine.target.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-labs</artifactId>
            <version>${appengine.target.version}</version>
        </dependency>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- JSON -->
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- Test Dependencies -->
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-testing</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-stubs</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring framework -->
        <!-- 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
            <version>2.5.6</version>
        </dependency>
        -->

        <!-- Javax persistence -->
        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-core</artifactId>
            <version>${datanucleus-core.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jpa_2.0_spec</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-api-jpa</artifactId>
            <version>3.1.3</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>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.5.1</version>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <archiveClasses>true</archiveClasses>
                    <webResources>
                        <!-- in order to interpolate version from pom into appengine-web.xml -->
                        <resource>
                            <directory>${basedir}/src/main/webapp/WEB-INF</directory>
                            <filtering>true</filtering>
                            <targetPath>WEB-INF</targetPath>
                        </resource>
                        <!--
                        <resource>
                            <directory>${basedir}/src/main/resources</directory>
                        </resource>
                        -->
                    </webResources>
                </configuration>
            </plugin>

            <plugin>
                <groupId>com.google.appengine</groupId>
                <artifactId>appengine-maven-plugin</artifactId>
                <version>${appengine.target.version}</version>
                <configuration>
                    <enableJarClasses>false</enableJarClasses>
                    <!--<jvmFlags>
                        <jvmFlag>-Ddatastore.backing_store=${basedir}\local_db.bin</jvmFlag>
                    </jvmFlags>
                    -->
                    <jvmFlags>
                        <jvmFlag>-Dappengine.generated.dir=${basedir}/tmp</jvmFlag>
                    </jvmFlags>
                    <!--
                    <jvmFlags>
                        <jvmFlag>-Xdebug</jvmFlag>
                        <jvmFlag>-Xrunjdwp:transport=dt_socket,address=8080,server=y,suspend=y</jvmFlag>
                    </jvmFlags>
                    -->
                    <disableUpdateCheck>true</disableUpdateCheck>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>3.1.1</version>
                <configuration>
                    <api>JPA</api>
                    <fork>false</fork>
                    <persistenceUnitName>transactions-optional</persistenceUnitName>
                    <verbose>true</verbose>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

さらに、このプロジェクトが appengine Eclipse プラグインを使用して作成されている場合、このようなことは起こらず、私のコードは正常に動作します。

前もって感謝します

4

4 に答える 4

2

しばらく App Engine を使用していましたが、最近プロジェクトを変換して Maven と Maven プラグインを使用しました。私は非常によく似た問題を抱えていました - local_db.bin ファイルの作成は起動アクションの一部ではないようです。

ただし、データストアから読み取ろうとすると、local_db.bin が見つからないため、作成されるというログ メッセージが表示されました (申し訳ありませんが、正確なログ メッセージが手元にありません)。その後、アプリケーションを正常に使用できました。確かに local_db が作成されました。

targetただし、ディレクトリではなくディレクトリにlocal_db.bin ファイルを作成していることに気付いたsrcので、サーバーを再起動するたびに local_db.bin ファイルが消去され、再作成する必要があります。したがって、local_db.bin作成されたら、 でそれを見つけて、target/your_SNAPSHOT/WEB-INF/appengine-generated自分のディレクトリにコピーできますsrc/main/webapp/WEB-INF/appengine-generatedtargetビルドを実行すると、ディレクトリに含まれるはずです。

これにはいくつかの欠点があることに注意してください。将来のセッションで行ったデータの変更は、ビルドごとに消去される local_db.bin に保存されるため保持されませんが、少なくとも使用するデータのベースを取得できます。うまくいけば、私 (またはここにいる他の誰か) がこれを機能させるためのより良い方法を見つけることができます。

于 2013-12-30T17:00:32.787 に答える
0

これを試してください(私にとってはうまくいきました):コードを実行して、local_db.binファイルを作成します。次に、Web サーバーがまだ実行されている間に、local_db.bin ファイルを Eclipse プロジェクトの /war/WEB-INF/appengine-generated/ ディレクトリに手動で追加します。

于 2014-06-09T21:15:55.130 に答える
0

私はこの問題に何ヶ月も苦労してきましたが、最終的に合理的な解決策にたどり着きました。

私にとっての問題は、サーバーが local_db.bin を /target ディレクトリ内に保持したいということでした。これは、私の開発環境で最も揮発性が高く、頻繁に削除されるディレクトリです。すべてのビルドは、データベースの全滅を意味していました。

そのため、GAE アプリ サーバーにファイルを別の場所に保存するように指示する必要がありましたが、これは Maven プラグインによって生成されたアプリサーバーでは明らかにできないようです。

解決

  1. Maven プラグイン (appengine-maven-plugin) を使用して devserver を起動しないでください。これでは、local_db.bin の場所を変更できません。代わりに、ここからローカル開発サーバーをダウンロードしてください。/bin ディレクトリには、必要な dev_appserver.sh が含まれます。
  2. /Users/Myself/path/to/sdk/APPENGINE_DB など、データベースを格納できるフォルダーを作成します。

  3. 次のコマンドで開発サーバーを起動します (明らかに、パスを独自のものと交換します)。

    cd /Users/Myself/path/to/sdk/appengine-java-sdk-1.9.40/bin
    sh dev_appserver.sh --generated_dir=/Users/Myself/path/to/sdk/APPENGINE_DB /Users/Myself/Projects/myapp/target/mayapp-1.0
    
于 2016-07-28T22:43:55.377 に答える