appengine-java-standard
appengine-java-standard copied to clipboard
java.lang.NoClassDefFoundError: com/google/storage/onestore/v3/proto2api/OnestoreEntity$Reference
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?
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.
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.
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?
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 ?
Ideally, knowing which jar is still referencing this class would help.
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)
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
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.
Yes, if you cannot get the dep tree, can you do a directory listing of the built web-inf/lib directory?
I will give a look, maybe some older dependency is wrongly referenced somewhere.
Thanks. To be clear, all is working with 2.0.21 right?
Yes, in 2.0.21 everything works well. It seems that from 2.0.32 something changed and breaks the remote API invocations.
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.
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.
Thanks!. I've a lead now, complicated but will resolve this soon.
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.
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.
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.
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:
DatastoreV3Pb type exists but in class file DatastorePb.class, not in DatastoreV3Pb.
Could it be the problem? Should the correct binding managed by classloader?
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!
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.
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.
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?
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?
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.
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.