appengine-java-standard icon indicating copy to clipboard operation
appengine-java-standard copied to clipboard

java.lang.NoClassDefFoundError: com/google/storage/onestore/v3/proto2api/OnestoreEntity$Reference

Open maurotaroni opened this issue 5 months ago • 16 comments

After migrating from version 2.0.21 to 2.0.36 we have experienced a java.lang.NoClassDefFoundError: com/google/storage/onestore/v3/proto2api/OnestoreEntity$Reference in invocations using Remote API.

The problem is caused by.

java.lang.NoClassDefFoundError: com/google/storage/onestore/v3/proto2api/OnestoreEntity$Reference
	at com.google.appengine.tools.remoteapi.RemoteDatastore.rewriteRequestReferences(RemoteDatastore.java:362)
	at com.google.appengine.tools.remoteapi.RemoteDatastore.handleGet(RemoteDatastore.java:279)
	at com.google.appengine.tools.remoteapi.RemoteDatastore.handleDatastoreCall(RemoteDatastore.java:105)
	at com.google.appengine.tools.remoteapi.RemoteApiDelegate.makeDefaultSyncCall(RemoteApiDelegate.java:71)
	at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate.makeSyncCall(StandaloneRemoteApiDelegate.java:60)
	at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate$1.call(StandaloneRemoteApiDelegate.java:71)
	at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate$1.call(StandaloneRemoteApiDelegate.java:67)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.ClassNotFoundException: com.google.storage.onestore.v3.proto2api.OnestoreEntity$Reference
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)

After testing all version from 2.0.21 to 2.0.36, we have noticed that the breaking changes occurred in version 2.0.32, where it seems that remoteapi had massive changes.

Any solution to keep using latest 2.0.36 and following versions while continue using remote API?

maurotaroni avatar Jun 17 '25 10:06 maurotaroni

It seems these classes are missing from the newer GAE API jar. Only the proto1 version is there.

The are repackaged as com.google.appengine.repackaged.com.google.storage.onestore.v3.proto2api so we need to adapt the remoteapis to use the repackaged path.

ludoch avatar Jun 17 '25 11:06 ludoch

Version <version>2.0.37</version> of all artifacts are being pushed right now. Will take a few minutes to show up in maven central. Try in an hour or less and let us know. Thanks for the report.

ludoch avatar Jun 17 '25 16:06 ludoch

I've tried the snapshot after recompiling locally on my machine. Now it works on local development server, while it doesn't work on real remote server, having now an other java.lang.NoClassDefFoundError: com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder. Should I open an other issue or reopen this?

maurotaroni avatar Jun 18 '25 07:06 maurotaroni

Reopened. Strange, as this relocation rule https://github.com/GoogleCloudPlatform/appengine-java-standard/blob/main/remoteapi/pom.xml#L123 is in place. What is the entire stack trace? Any change to share output of mvn compile dependency:tree ?

ludoch avatar Jun 18 '25 08:06 ludoch

Ideally, knowing which jar is still referencing this class would help.

ludoch avatar Jun 18 '25 08:06 ludoch

The full stack trace is the following:

java.lang.NoClassDefFoundError: com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder
	at com.google.appengine.tools.remoteapi.TransactionBuilder.makeCommitRequest(TransactionBuilder.java:140)
	at com.google.appengine.tools.remoteapi.RemoteDatastore.handleCommit(RemoteDatastore.java:261)
	at com.google.appengine.tools.remoteapi.RemoteDatastore.handleDatastoreCall(RemoteDatastore.java:101)
	at com.google.appengine.tools.remoteapi.RemoteApiDelegate.makeDefaultSyncCall(RemoteApiDelegate.java:71)
	at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate.makeSyncCall(StandaloneRemoteApiDelegate.java:60)
	at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate$1.call(StandaloneRemoteApiDelegate.java:71)
	at com.google.appengine.tools.remoteapi.StandaloneRemoteApiDelegate$1.call(StandaloneRemoteApiDelegate.java:67)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.ClassNotFoundException: com.google.apphosting.datastore.proto2api.DatastoreV3Pb$DeleteRequestOrBuilder
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)

appengine_dependency_tree.txt

maurotaroni avatar Jun 18 '25 08:06 maurotaroni

Cannot repro. I downloaded the jar from https://repo1.maven.org/maven2/com/google/appengine/appengine-remote-api/2.0.37/ with version 2.0.37, extracted it and used javap to introspect the class TransactionBuilder.class

javap -v TransactionBuilder.class |grep Datastore #26 = Utf8 com/google/apphosting/api/proto2api/DatastorePb$QueryResult #27 = Class #26 // com/google/apphosting/api/proto2api/DatastorePb$QueryResult #28 = Utf8 com/google/apphosting/api/proto2api/DatastorePb #29 = Class #28 // com/google/apphosting/api/proto2api/DatastorePb #44 = Utf8 com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest #45 = Class #44 // com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest #47 = Utf8 com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder #48 = Class #47 // com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder #55 = Utf8 com/google/apphosting/api/proto2api/DatastorePb$PutRequest #56 = Class #55 // com/google/apphosting/api/proto2api/DatastorePb$PutRequest #58 = Utf8 com/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder #59 = Class #58 // com/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder #132 = Utf8 ([B)Lcom/google/apphosting/api/proto2api/DatastorePb$QueryResult; #186 = Utf8 ()Lcom/google/apphosting/api/proto2api/DatastorePb$QueryResult; #187 = NameAndType #185:#186 // getResult:()Lcom/google/apphosting/api/proto2api/DatastorePb$QueryResult; #188 = Methodref #20.#187 // com/google/apphosting/base/protos/api/RemoteApiPb$TransactionQueryResult$Builder.getResult:()Lcom/google/apphosting/api/proto2api/DatastorePb$QueryResult; #245 = Utf8 ()Lcom/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder; #246 = NameAndType #244:#245 // getDeletesBuilder:()Lcom/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder; #247 = Methodref #35.#246 // com/google/apphosting/base/protos/api/RemoteApiPb$TransactionRequest$Builder.getDeletesBuilder:()Lcom/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder; #251 = Methodref #48.#250 // com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder.addKeyBuilder:()Lcom/google/appengine/repackaged/com/google/storage/onestore/v3/proto2api/OnestoreEntity$Reference$Builder; #259 = Utf8 ()Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; #260 = NameAndType #258:#259 // getPutsBuilder:()Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; #261 = Methodref #35.#260 // com/google/apphosting/base/protos/api/RemoteApiPb$TransactionRequest$Builder.getPutsBuilder:()Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; #263 = Utf8 (Lcom/google/appengine/repackaged/com/google/storage/onestore/v3/proto2api/OnestoreEntity$EntityProto;)Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; #264 = NameAndType #262:#263 // addEntity:(Lcom/google/appengine/repackaged/com/google/storage/onestore/v3/proto2api/OnestoreEntity$EntityProto;)Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; #265 = Methodref #59.#264 // com/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder.addEntity:(Lcom/google/appengine/repackaged/com/google/storage/onestore/v3/proto2api/OnestoreEntity$EntityProto;)Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; public com.google.apphosting.api.proto2api.DatastorePb$QueryResult handleQueryResult(byte[]); descriptor: ([B)Lcom/google/apphosting/api/proto2api/DatastorePb$QueryResult; 135: invokevirtual #188 // Method com/google/apphosting/base/protos/api/RemoteApiPb$TransactionQueryResult$Builder.getResult:()Lcom/google/apphosting/api/proto2api/DatastorePb$QueryResult; 145: invokevirtual #247 // Method com/google/apphosting/base/protos/api/RemoteApiPb$TransactionRequest$Builder.getDeletesBuilder:()Lcom/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder; 148: invokevirtual #251 // Method com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder.addKeyBuilder:()Lcom/google/appengine/repackaged/com/google/storage/onestore/v3/proto2api/OnestoreEntity$Reference$Builder; 214: invokevirtual #261 // Method com/google/apphosting/base/protos/api/RemoteApiPb$TransactionRequest$Builder.getPutsBuilder:()Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; 219: invokevirtual #265 // Method com/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder.addEntity:(Lcom/google/appengine/repackaged/com/google/storage/onestore/v3/proto2api/OnestoreEntity$EntityProto;)Lcom/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder; public static final #30= #27 of #29; // QueryResult=class com/google/apphosting/api/proto2api/DatastorePb$QueryResult of class com/google/apphosting/api/proto2api/DatastorePb public static final #46= #45 of #29; // DeleteRequest=class com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest of class com/google/apphosting/api/proto2api/DatastorePb public static final #21= #48 of #45; // Builder=class com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest$Builder of class com/google/apphosting/api/proto2api/DatastorePb$DeleteRequest public static final #57= #56 of #29; // PutRequest=class com/google/apphosting/api/proto2api/DatastorePb$PutRequest of class com/google/apphosting/api/proto2api/DatastorePb public static final #21= #59 of #56; // Builder=class com/google/apphosting/api/proto2api/DatastorePb$PutRequest$Builder of class com/google/apphosting/api/proto2api/DatastorePb$PutRequest

ludo-mac:remoteapi ludo$ javap -v TransactionBuilder.class |grep DatastoreV3 Returns nothing, there is no such reference.

Can you send the transitive dep of your project? It should only reference to appengine-remote-api-2.0.37.jar and appengine-api-1.0-sdk-2.0.37.jar

ludoch avatar Jun 18 '25 10:06 ludoch

I've recently migrated my Ant+Ivy project to Maven. In the oldest project I have the following error while connecting remote:

java.lang.NoClassDefFoundError: com/google/appengine/repackaged/io/grpc/Context
	at com.google.appengine.repackaged.io.opencensus.trace.unsafe.ContextManagerImpl.currentContext(ContextManagerImpl.java:30)
	at com.google.appengine.repackaged.io.opencensus.trace.unsafe.ContextHandleUtils.currentContext(ContextHandleUtils.java:56)
	at com.google.appengine.repackaged.io.opencensus.trace.CurrentSpanUtils.getCurrentSpan(CurrentSpanUtils.java:37)
	at com.google.appengine.repackaged.io.opencensus.trace.Tracer.spanBuilder(Tracer.java:308)
	at com.google.appengine.repackaged.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:865)
	at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:304)
	at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:324)
	at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.Credential.executeRefreshToken(Credential.java:547)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:366)
	at com.google.appengine.repackaged.com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:470)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.fromStreamUser(GoogleCredential.java:827)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.fromStream(GoogleCredential.java:251)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getCredentialUsingEnvironmentVariable(DefaultCredentialProvider.java:217)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredentialUnsynchronized(DefaultCredentialProvider.java:119)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.DefaultCredentialProvider.getDefaultCredential(DefaultCredentialProvider.java:95)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:195)
	at com.google.appengine.repackaged.com.google.api.client.googleapis.auth.oauth2.GoogleCredential.getApplicationDefault(GoogleCredential.java:173)
	at com.google.appengine.tools.remoteapi.RemoteApiOptions.useApplicationDefaultCredential(RemoteApiOptions.java:174)
...
Caused by: java.lang.ClassNotFoundException: com.google.appengine.repackaged.io.grpc.Context
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)

If it works on your machine I suspect the problem could be related to some stale dependency on my configurations, maybe due to how dependency are differently resolved by Ivy and Maven.

maurotaroni avatar Jun 18 '25 15:06 maurotaroni

Yes, if you cannot get the dep tree, can you do a directory listing of the built web-inf/lib directory?

ludoch avatar Jun 18 '25 15:06 ludoch

I will give a look, maybe some older dependency is wrongly referenced somewhere.

maurotaroni avatar Jun 19 '25 05:06 maurotaroni

This is my dependency tree.

dependency_tree.txt

maurotaroni avatar Jun 19 '25 05:06 maurotaroni

Thanks. To be clear, all is working with 2.0.21 right?

ludoch avatar Jun 19 '25 06:06 ludoch

Yes, in 2.0.21 everything works well. It seems that from 2.0.32 something changed and breaks the remote API invocations.

maurotaroni avatar Jun 19 '25 07:06 maurotaroni

Thanks! I can understand and fix com/google/appengine/repackaged/io/grpc/Context

But still puzzled with com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder Can you confirm you also still see this one? Need to investigate more.

ludoch avatar Jun 19 '25 09:06 ludoch

Yes, I confirm tha com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder is still existing, but only interacting with remote server. Interacting locally everything works as expected. I'm still investigating on what can change from local to remote interaction.

maurotaroni avatar Jun 19 '25 12:06 maurotaroni

Thanks!. I've a lead now, complicated but will resolve this soon.

ludoch avatar Jun 19 '25 15:06 ludoch

I've tried the snapshot after recompiling locally on my machine. Now it works on local development server, while it doesn't work on real remote server, having now an other java.lang.NoClassDefFoundError: com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder. Should I open an other issue or reopen this?

Could you try for now to avoid using the cloned source and the snapshot build? From your appengine_dependency_tree.txt I see you are building on Windows, and I am not sure Windows is a supported build env for the GAE classes (personally had some issues and this OS is not a default dev machine at Google).

When you say local version remote, also not sure what it means. I see you are using the stub APIs so you are doing local api testing before deploying, Is that where you see the error? Stub emulation emulates the remote server, but this remote server is also local. So to clarify: if you avoid local tests, and deploy, and access the real remote server, is it working?

Final question: "I confirm tha com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder is still existing," Where is this class in your web app lib dependencies? Thanks.

ludoch avatar Jun 20 '25 07:06 ludoch

I've found class that tryes to load the com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder. It's com.google.apphosting.base.protos.api.RemoteApiPb.

Image

Image

As you can see, something has changed between 2.0.21 and 2.0.37 (and maybe from 2.0.32).

I'm using 2.0.37, maybe the dependency tree was related to an instant where it wasn't still available.

maurotaroni avatar Jun 20 '25 07:06 maurotaroni

I've missed your final statement:

For local, I mean working locally with Development server.

For remote, I mean working remotely with real remote server.

I've investigated further and I'm a bit confused:

Image

DatastoreV3Pb type exists but in class file DatastorePb.class, not in DatastoreV3Pb.

Could it be the problem? Should the correct binding managed by classloader?

maurotaroni avatar Jun 20 '25 09:06 maurotaroni

For whatever reason (same on my system) a Java decompiler shows the original source code and not the decompiled class. You can see that as in your image, you can see the first 2 lines are java comments that should not be in the .class

// Generated by the protocol buffer compiler. DO NOT EDIT! // source datastore_v3.proto_

You also see the comments for methods that should not be stored in a class file So maybe this decompiler and mine shows the original java file and does not show accurate data from the .class file?

We do a rename processing for historical reasons, (via maven shading). If you do a javap -v on this class, and grep for Datastore, you'll see for ex:

public static #206= #205 of #2; // TransactionOrBuilder=class com/google/apphosting/api/proto2api/DatastorePb$TransactionOrBuilder of class com/google/apphosting/api/proto2api/DatastorePb

so with correct com/google/apphosting/api/proto2api/DatastorePb from the DatastorePb.class

Next steps would be for you to make sure you delete entirely the clone of this repository, so you do not have on your system a copy of the GAE source code. (maybe even in the maven .m2/repository cache and see the content again of the class you get from the api jar from https://repo1.maven.org/maven2/com/google/appengine/appengine-api-1.0-sdk/2.0.37/ My system contains so many copies, I am not sure I can do this cleanup.

Anyway, I still need to understand your stack trace which is real!

ludoch avatar Jun 20 '25 16:06 ludoch

Hi, Almost done for my fix for missing grpc context class.

Now, for the other issue you are facing, I suspect it is due to your project dependencies on appengine-gcs-client and appengine-pipeline.

These 2 libraries are not supported anymore (versions less than 1.0) and not recommended to use as they depend on ancient version of appengine-api-1.0-sdk.

If you can stop depending on these libs, I would really suggest you do. If you cannot, you can try to exclude the old transitive dep on appengine-api-1.0-sdk inside these libraries with the exclude statement:


        <dependency>
            <groupId>com.google.appengine.tools</groupId>
            <artifactId>appengine-gcs-client</artifactId>
            <version>0.8</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.appengine</groupId>
                    <artifactId>appengine-api-1.0-sdk</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.appengine.tools</groupId>
            <artifactId>appengine-pipeline</artifactId>
            <version>0.2.13</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.appengine</groupId>
                    <artifactId>appengine-api-1.0-sdk</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

But no guarantee that would work, let me know.

ludoch avatar Jun 23 '25 05:06 ludoch

Sorry for the delay. I've purged all my local repository and also appengine repository clone. I've removed only the appengine-gcs-client dependency because appengine-pipeline is currently used and referenced by our application. The problem Exception in thread "main" java.lang.NoClassDefFoundError: com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder still exists.

I'll investigate further trying to understand who tries to load that class.

maurotaroni avatar Jun 23 '25 06:06 maurotaroni

After removing this reference appengine-tools-sdk from appengine-testing now I don't have no more Exception in thread "main" java.lang.NoClassDefFoundError: com/google/apphosting/datastore/proto2api/DatastoreV3Pb$DeleteRequestOrBuilder still

Now I have an other error (only working with real remote server):

java.lang.IllegalArgumentException: No ancestor in transactional query.
	at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:67)
	at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:150)
	at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:123)
	at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:107)
	at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:83)
	at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:47)
	at com.google.appengine.api.datastore.BaseQueryResultsSource.getIndexList(BaseQueryResultsSource.java:182)
	at com.google.appengine.api.datastore.BaseQueryResultsSource.loadMoreEntities(BaseQueryResultsSource.java:218)
	at com.google.appengine.api.datastore.BaseQueryResultsSource.loadMoreEntities(BaseQueryResultsSource.java:194)
	at com.google.appengine.api.datastore.QueryResultIteratorImpl.ensureLoaded(QueryResultIteratorImpl.java:186)
	at com.google.appengine.api.datastore.QueryResultIteratorImpl.hasNext(QueryResultIteratorImpl.java:83)
	at com.googlecode.objectify.util.TranslatingIterator.hasNext(TranslatingIterator.java:29)
	at com.googlecode.objectify.util.QueryResultIteratorWrapper.hasNext(QueryResultIteratorWrapper.java:39)

As I can see from source code on repository, seems that not al reference to checking for ancestor queries inside transactions has been removed, at least in: • src\main\java\com\google\apphosting\utils\remoteapi\EE10RemoteApiServlet.java (row 266) • src\main\java\com\google\apphosting\utils\remoteapi\RemoteApiServlet.java (row 266)

I don't have the same error working on local development server.

Is it correct to exclude reference to appengine-tools-sdk?

maurotaroni avatar Jun 23 '25 13:06 maurotaroni

OK, making progress. Still puzzled you do not see the error about missing grpc context.

the RemoteApiServlet.java code was before using proto1 and the code then was

private byte[] executeTxQuery(Request request) { TransactionQueryResult result = new TransactionQueryResult();

Query query = new Query();
parseFromBytes(query, request.getRequestAsBytes());

if (!query.hasAncestor()) {
  throw new ApiProxy.ApplicationException(BAD_REQUEST.getValue(),
                                          "No ancestor in transactional query.");
}

Which is I think equivalent in current file. Nothing has been removed there. Can you explain more?

now., exploring guts of appengine-tools-sdk to understand why you have to remove it from appengine-testing. Any more side effect with entire testing you have?

ludoch avatar Jun 23 '25 14:06 ludoch

What I was expecting from this commit https://github.com/GoogleCloudPlatform/appengine-java-standard/commit/7f7a0d4b5e277e283db116788a937241a99e53d4, is that now I can query in transaction without having an ancestor. That commit works everywhere except in remote API invocations: maybe the modifications hasn't been applyed everywhere?

By the way, without removing the appengine-tools-sdk dependency and still keeping appengine-gcs-client and appengine-pipeline, it seem's to work also with your suggestion that exclude the appengine-api-1.0-sdk transitive dependency.

          <dependency>
            <groupId>com.google.appengine.tools</groupId>
            <artifactId>appengine-gcs-client</artifactId>
            <version>0.8</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.appengine</groupId>
                    <artifactId>appengine-api-1.0-sdk</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.google.appengine.tools</groupId>
            <artifactId>appengine-pipeline</artifactId>
            <version>0.2.13</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.appengine</groupId>
                    <artifactId>appengine-api-1.0-sdk</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

I'm investigating on what changes in the dependency tree and maybe in classpath.

Thank you for all your patience and support.

maurotaroni avatar Jun 24 '25 05:06 maurotaroni

We believe v2.0.38 addresses the remoteapi issue. Going forward, using unsupported versions of ancient libraries (<0.x versions) might not work with latest GAE versions, so you might be stuck with old versions or remove unsupported versions of libraries.

ludoch avatar Jun 26 '25 14:06 ludoch