fix(java): initialize classes at build-time to fix Native Image compilation#874
fix(java): initialize classes at build-time to fix Native Image compilation#874BenWhitehead merged 4 commits intomainfrom
Conversation
| # CloudStorageFileSystemProvider and all the sub-classes referenced by | ||
| # this class also being initialized at build time. |
There was a problem hiding this comment.
Only for static fields or static initializers are needed.
There was a problem hiding this comment.
Slightly updated the comment here. Let me know if this sounds okay to you? Explored the code a little further to double check what's happening: The initialization of classes stems from CloudStorageFileSystemProvider which causes StorageOptions and as a result StorageOptionsUtil to be initialized at build time.
Looks like this seems to be the case in the reproducer as well where when we create a new class MyOptions and instantiate it in MySampleFileSystemProvider, MyOptions ends up getting initialized at build time.
| com.google.cloud.storage.StorageOptions,\ | ||
| com.google.cloud.storage.DefaultStorageRetryStrategy,\ | ||
| com.google.api.client.http.OpenCensusUtils,\ | ||
| com.google.api.client.http.GenericUrl,\ |
There was a problem hiding this comment.
(I'm curious about how you get the list)
If we don't have this GenericUrl line here, what kind of error do you get?
There was a problem hiding this comment.
Removing GenericUrl results in:
Error: Classes that should be initialized at run time got initialized during image building:
com.google.api.client.http.GenericUrl was unintentionally initialized at build time. To see why com.google.api.client.http.GenericUrl got initialized use --trace-class-initialization=com.google.api.client.http.GenericUrl
And removing all the other classes results in a similar error for the following classes:
--trace-class-initialization=com.google.api.client.json.gson.GsonParser$1,io.opencensus.trace.Tracing,io.opencensus.trace.EndSpanOptions,com.google.api.client.http.HttpRequest,org.threeten.bp.Duration,com.google.api.client.http.javanet.NetHttpTransport,com.google.auth.oauth2.OAuth2Utils,com.google.cloud.storage.StorageOptions,io.opencensus.contrib.http.util.CloudTraceFormat,com.google.auth.oauth2.DefaultCredentialsProvider,io.opencensus.trace.Status,io.opencensus.trace.AutoValue_EndSpanOptions,com.google.cloud.storage.DefaultStorageRetryStrategy,com.google.api.client.http.OpenCensusUtils,com.google.cloud.storage.StorageException,com.google.gson.stream.JsonReader,com.google.auth.oauth2.OAuth2Credentials,com.google.api.client.util.DateTime,com.google.api.client.util.escape.PercentEscaper,com.google.cloud.ExceptionHandler,io.opencensus.trace.BlankSpan,io.opencensus.trace.SpanContext,com.google.api.client.json.JsonParser$1,com.google.api.client.http.HttpTransport,com.google.api.client.http.HttpMediaType,com.google.auth.oauth2.GoogleCredentials,com.google.common.collect.RegularImmutableMap,io.opencensus.trace.Span,com.google.api.client.http.GenericUrl,com.google.cloud.ServiceOptions,com.google.api.client.util.Data,com.google.api.client.util.escape.CharEscapers,com.google.cloud.PlatformInformation
| com.google.cloud.storage.StorageOptions,\ | ||
| com.google.cloud.storage.DefaultStorageRetryStrategy,\ | ||
| com.google.api.client.http.OpenCensusUtils,\ | ||
| com.google.api.client.http.GenericUrl,\ |
BenWhitehead
left a comment
There was a problem hiding this comment.
I had to add some additional classes, not sure if that's unexpected
...in/resources/META-INF/native-image/com/google/cloud/google-cloud-nio/native-image.properties
Outdated
Show resolved
Hide resolved
🤖 I have created a release *beep* *boop* --- ### [0.123.28](v0.123.27...v0.123.28) (2022-04-18) ### Bug Fixes * **native:** initialize classes at build-time to fix Native Image compilation ([#874](#874)) ([df905cb](df905cb)) * **test:** replace HashMap with ConcurrentHashMap to avoid ConcurrentModificatio… ([#883](#883)) ([d2fe2a0](d2fe2a0)) ### Dependencies * update dependency com.google.apis:google-api-services-storage to v1-rev20220401-1.32.1 ([#881](#881)) ([a598199](a598199)) * update dependency com.google.cloud:google-cloud-shared-dependencies to v2.10.0 ([#884](#884)) ([c08f115](c08f115)) * update dependency com.google.cloud:google-cloud-storage to v2.6.0 ([#878](#878)) ([0bd1985](0bd1985)) * update dependency com.google.cloud:google-cloud-storage to v2.6.1 ([#885](#885)) ([cf24525](cf24525)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- ### [0.123.28](googleapis/java-storage-nio@v0.123.27...v0.123.28) (2022-04-18) ### Bug Fixes * **native:** initialize classes at build-time to fix Native Image compilation ([#874](googleapis/java-storage-nio#874)) ([22f1464](googleapis/java-storage-nio@22f1464)) * **test:** replace HashMap with ConcurrentHashMap to avoid ConcurrentModificatio… ([#883](googleapis/java-storage-nio#883)) ([31f823c](googleapis/java-storage-nio@31f823c)) ### Dependencies * update dependency com.google.apis:google-api-services-storage to v1-rev20220401-1.32.1 ([#881](googleapis/java-storage-nio#881)) ([4f89adc](googleapis/java-storage-nio@4f89adc)) * update dependency com.google.cloud:google-cloud-shared-dependencies to v2.10.0 ([#884](googleapis/java-storage-nio#884)) ([9d06c27](googleapis/java-storage-nio@9d06c27)) * update dependency com.google.cloud:google-cloud-storage to v2.6.0 ([#878](googleapis/java-storage-nio#878)) ([425f3de](googleapis/java-storage-nio@425f3de)) * update dependency com.google.cloud:google-cloud-storage to v2.6.1 ([#885](googleapis/java-storage-nio#885)) ([8329458](googleapis/java-storage-nio@8329458)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- ### [0.123.28](googleapis/java-storage-nio@v0.123.27...v0.123.28) (2022-04-18) ### Bug Fixes * **native:** initialize classes at build-time to fix Native Image compilation ([#874](googleapis/java-storage-nio#874)) ([22f1464](googleapis/java-storage-nio@22f1464)) * **test:** replace HashMap with ConcurrentHashMap to avoid ConcurrentModificatio… ([#883](googleapis/java-storage-nio#883)) ([31f823c](googleapis/java-storage-nio@31f823c)) ### Dependencies * update dependency com.google.apis:google-api-services-storage to v1-rev20220401-1.32.1 ([#881](googleapis/java-storage-nio#881)) ([4f89adc](googleapis/java-storage-nio@4f89adc)) * update dependency com.google.cloud:google-cloud-shared-dependencies to v2.10.0 ([#884](googleapis/java-storage-nio#884)) ([9d06c27](googleapis/java-storage-nio@9d06c27)) * update dependency com.google.cloud:google-cloud-storage to v2.6.0 ([#878](googleapis/java-storage-nio#878)) ([425f3de](googleapis/java-storage-nio@425f3de)) * update dependency com.google.cloud:google-cloud-storage to v2.6.1 ([#885](googleapis/java-storage-nio#885)) ([8329458](googleapis/java-storage-nio@8329458)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Using META-INF/services with Native Image compilation causes the
FileSystemProviderclass to be initialized at build time. This causescom.google.cloud.storage.contrib.nio.CloudStorageFileSystemProviderand a couple of unexpected classes that are referenced to also be initialized at build time.