Code: Select all
e:
Code: Select all
cd E:\myProj\myWebApp
Code: Select all
"E:\Google\Cloud SDK\google-cloud-sdk\bin\java_dev_appserver.cmd" --generated_dir="E:\myProj\localAppData" --address=0.0.0.0 --port=8190 "E:\myProj\myWebApp\target\myProjWebApp-1.0.0"
Ich habe eine Datei „local_db.bin“ und eine Datei „datastore-indexes-auto.xml“ unter dem Ordner:
Code: Select all
E:\myProj\localAppData
Jetzt möchte ich:
- den Datenspeicher-Emulator als separaten Prozess starten
- meine Anwendung damit verbinden
- verwenden die durch frühere Ausführungen erstellten Daten
Um den Datenspeicher-Emulator zu starten (Java-Version ist 17), verwende ich diesen Befehl:
Code: Select all
e:
Code: Select all
cd E:\myNewApp\src\main\webapp
Code: Select all
gcloud beta emulators datastore start --data-dir="E:\myNewApp\src\main\webapp"
Code: Select all
E:\myNewProj\src\main\webapp>gcloud beta emulators datastore start --data-dir="E:\myNewProj\src\main\webapp"
WARNING: Cloud Datastore Emulator support for Java JRE version 11 will be dropped after gcloud command-line tool release 508.0.0. Please upgrade to Java JRE version 21 or higher to continue using the latest Cloud Datastore Emulator.
WARNING: Reusing existing data in [E:\myNewProj\src\main\webapp].
Executing: cmd /c E:\Google\Cloud SDK\google-cloud-sdk\platform\cloud-datastore-emulator\cloud_datastore_emulator.cmd start --host=localhost --port=8081 --store_on_disk=True --allow_remote_shutdown --consistency=0.9 E:\myNewProj\src\main\webapp
[datastore] Jan 13, 2025 11:28:51 AM com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction$9 apply
[datastore] INFO: Provided --allow_remote_shutdown to start command which is no longer necessary.
[datastore] Jan 13, 2025 11:28:51 AM com.google.cloud.datastore.emulator.CloudDatastore$StartAction apply
[datastore] INFO: Running CLOUD_DATASTORE emulator.
[datastore] Jan 13, 2025 11:28:51 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub
[datastore] INFO: Local Datastore initialized:
[datastore] Type: High Replication
[datastore] Storage: E:\myNewProj\src\main\webapp\WEB-INF\appengine-generated\local_db.bin
[datastore] Jan 13, 2025 11:28:52 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub$BackwardsCompatibleInputStream readClassDescriptor
[datastore] INFO: Error converting backwards compatible class: Unable to make field private java.lang.String java.io.ObjectStreamClass.name accessible: module java.base does not "opens java.io" to unnamed module @7bab3f1a
[datastore] Jan 13, 2025 11:28:52 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub$BackwardsCompatibleInputStream readClassDescriptor
[datastore] INFO: Error converting backwards compatible class: Unable to make field private java.lang.String java.io.ObjectStreamClass.name accessible: module java.base does not "opens java.io" to unnamed module @7bab3f1a
[datastore] Jan 13, 2025 11:28:52 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub load
[datastore] INFO: Failed to load from the backing store, E:\myNewProj\src\main\webapp\WEB-INF\appengine-generated\local_db.bin
[datastore] java.lang.ClassNotFoundException: com.google.appengine.api.datastore.dev.LocalDatastoreService$Profile
[datastore] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
[datastore] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
[datastore] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
[datastore] at java.base/java.lang.Class.forName0(Native Method)
[datastore] at java.base/java.lang.Class.forName(Class.java:467)
[datastore] at java.base/java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:773)
[datastore] at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2034)
[datastore] at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1898)
[datastore] at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2224)
[datastore] at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733)
[datastore] at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509)
[datastore] at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467)
[datastore] at java.base/java.util.HashMap.readObject(HashMap.java:1552)
[datastore] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[datastore] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
[datastore] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[datastore] at java.base/java.lang.reflect.Method.invoke(Method.java:569)
[datastore] at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1100)
[datastore] at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2423)
[datastore] at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257)
[datastore] at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733)
[datastore] at java.base/java.io.ObjectInputStream$FieldValues.(ObjectInputStream.java:2606)
[datastore] at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2457)
[datastore] at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257)
[datastore] at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733)
[datastore] at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509)
[datastore] at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467)
[datastore] at com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub.load(LocalDatastoreFileStub.java:637)
[datastore] at com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub.startInternal(LocalDatastoreFileStub.java:151)
[datastore] at com.google.cloud.datastore.emulator.impl.BaseLocalDatastore$3.run(BaseLocalDatastore.java:432)
[datastore] at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
[datastore] at com.google.cloud.datastore.emulator.impl.BaseLocalDatastore.start(BaseLocalDatastore.java:428)
[datastore] at com.google.cloud.datastore.emulator.DatastoreEmulator.start(DatastoreEmulator.java:37)
[datastore] at com.google.cloud.datastore.emulator.CloudDatastore$1.start(CloudDatastore.java:656)
[datastore] at com.google.cloud.datastore.emulator.CloudDatastore$StartAction.apply(CloudDatastore.java:566)
[datastore] at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:58)
[datastore] at com.google.cloud.datastore.emulator.CloudDatastore.run(CloudDatastore.java:769)
[datastore] at com.google.cloud.datastore.emulator.CloudDatastore.main(CloudDatastore.java:727)
[datastore]
[datastore] API endpoint: http://localhost:8081
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore]
[datastore] export DATASTORE_EMULATOR_HOST=localhost:8081
[datastore]
[datastore] Dev App Server is now running.
[datastore]
[datastore] The previous line was printed for backwards compatibility only.
[datastore] If your tests rely on it to confirm emulator startup,
[datastore] please migrate to the emulator health check endpoint (/). Thank you!
[datastore] The health check endpoint for this emulator instance is http://localhost:8081/
Aus dem Protokoll geht hervor, dass die fehlerhafte Zeile lautet:
Code: Select all
java.lang.ClassNotFoundException: com.google.appengine.api.datastore.dev.LocalDatastoreService$Profile
Wie löse ich das?
Wenn es welche ist Hilfe, das ist meine Motivation: Ab sofort verwendet diese App Java für die Serverseite. Ich erstelle eine .war-Datei und kann sie lokal ausführen (wie oben erwähnt) sowie sie auch auf der Google App Engine bereitstellen und ausführen. All das funktioniert.
Aus heutiger Sicht wird der Krieg jedoch auf einer „bereitgestellten“ Jetty-Instanz bereitgestellt. Es ist wahrscheinlich, dass diese „Bereitstellung“ von Jetty in Zukunft abgeschafft wird.
Daher möchte ich (wie ich es jetzt tue) eine Kriegsdatei erstellen. Aber anstatt diese War-Datei in GAE bereitzustellen, möchte ich ein Docker-Image mit *nix und Tomcat erstellen, meinen War auf diesem Tomcat bereitstellen und dann weiterhin auf meine Daten zugreifen, die sich bereits im Datenspeicher befinden.
Ich versuche, diesen Stack auf meiner lokalen Entwicklungsumgebung zu simulieren, und dafür ist es von entscheidender Bedeutung, den lokalen Datenspeicher-Emulator zum Laufen zu bringen.
Irgendeine Hilfe? Bitte.