Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Offer a better migration path from protobuf-java 3.x to 4.x #16452

Open
ummels opened this issue Apr 9, 2024 · 3 comments
Open

Offer a better migration path from protobuf-java 3.x to 4.x #16452

ummels opened this issue Apr 9, 2024 · 3 comments
Assignees

Comments

@ummels
Copy link

ummels commented Apr 9, 2024

What language does this apply to?

Java

Describe the problem you are trying to solve.

After updating our project protobuf-java to 4.26.0 within my project, we noticed a serious runtime error in production: Code from an external dependency we're using is throwing a ClassNotFoundException while accessing the newBuilder() method of a generated class:

java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3$ExtendableMessageOrBuilder
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	at no.ecc.vectortile.VectorTileEncoder.encode(VectorTileEncoder.java:359)

This is a serious problem since there are many Java libraries floating around, which internally use Protobuf.

Describe the solution you'd like

In my opinion, the easiest way to fix the incompatibility would be to reintroduce GeneratedMessageV3 as a (deprecated) alias for GeneratedMessage, but maybe there are better alternatives?

@ummels ummels added the untriaged auto added to all issues by default when created. label Apr 9, 2024
@ummels
Copy link
Author

ummels commented Apr 9, 2024

See also grpc/grpc-java#11015.

@ummels ummels changed the title Bring Back GeneratedMessageV3 Offer a better migration path from protobuf-java 3.x to 4.x Apr 9, 2024
@googleberg
Copy link
Member

@ummels thank you for the feedback. We are evaluating the option to reintroduce GeneratedMessageV3 as a deprecated shim to smooth the transition.

Just want to add that in line with our version policy we will be supporting the protobuf 3.x line for a year to allow projects to update/adapt.

@googleberg
Copy link
Member

The protobuf team has been looking at better migration paths for this first major version bump since the introduction of proto3 and future major version bumps. We'll publish the plan soon at https://protobuf.dev/support/version-support/

The exact date and version numbers are still TBD, but this quarter (between now and 7/1/24) we will make a a set of releases that allow gencode from a new patch release of the 3.25.- line to work with runtimes from the 4.-.- release (and all v4 releases following).

Because we're getting to this a bit slowly, we will also be extending support for 3.25.- to Q1 of 2026 to allow plenty of time for users to migrate.

Thank you for your patience.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants