googleapis / googleapis/google-api-java-client-services

Native compilation with GraalVM

未关闭
#23,642 5 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
priority: p3 type: bug
主要语言
Java
星标
725
派生
394
平均合并
42 分钟
30 天内合并 PR
257

描述

There is an issue when using native compilation with GraalVM. I'm trying to use the **Admin SDK API Client Library** for directory operations.

#### Environment details

- Admin SDK API Client Library, version _directory_v1-rev20240924-2.0.0_
- Java Temurin 21
- Native compilation of a _Spring Boot 3.3.4_ app using by default at this time :
- paketo-buildpacks/ca-certificates 3.8.6
- paketo-buildpacks/bellsoft-liberica 10.9.0
- paketo-buildpacks/syft 2.1.0
- paketo-buildpacks/executable-jar 6.11.3
- paketo-buildpacks/spring-boot 5.31.2
- paketo-buildpacks/native-image 5.14.4

#### Steps to reproduce

Fresh **Spring Boot 3.3.4** project.

**Maven configuration**
```xml

com.google.apis
google-api-services-admin-directory
directory_v1-rev20240924-2.0.0

...

org.graalvm.buildtools
native-maven-plugin

```

**Build Directory service**

```java
private Directory buildDirectoryService(@Nonnull final String gcpKey, @Nonnull final String serviceAccountUser) throws IOException, GeneralSecurityException {
final ServiceAccountCredentials sourceCredentials =
ServiceAccountCredentials.fromStream(...)
.toBuilder()
.setServiceAccountUser(serviceAccountUser)
.setScopes(ImmutableSet.of(
DirectoryScopes.ADMIN_DIRECTORY_GROUP_READONLY,
DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY
))
.build();

return new Directory.Builder(Utils.getDefaultTransport(), Utils.getDefaultJsonFactory(), new HttpCredentialsAdapter(sourceCredentials))
.setApplicationName("MY_APP")
.build();
}
```

**Add reflection hints for ErrorInfo.class**
```java
@Configuration
@ImportRuntimeHints(NativeImageHints.class)
class NativeImageHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
hints.reflection().registerType(ErrorInfo.class, (type) -> type.withConstructor(Collections.emptyList(), ExecutableMode.INVOKE));
}
}
```

**Directory api call**
```java
final Users batch = directory
.users()
.list()
.setMaxResults(100)
.setDomain("my-domain.com")
.execute();
```

**Build and run image**
```shell
mvn clean spring-boot:build-image -e --no-transfer-progress -P native -D skipTests=true
docker run -p 8080:8080 my-app:0.0.1-SNAPSHOT
```

**Result of directory execute()**
```
2024-10-14T12:44:13.891Z INFO 1 --- [my-app] [nio-8080-exec-1] c.google.api.client.http.HttpTransport : {
"error": {
"code": 400,
"message": "Bad Request",
"errors": [
{
"message": "Bad Request",
"domain": "global",
"reason": "badRequest"
}
]
}
}
```

**Reason**
If I launch the app in DEBUG logging mode, I can see that the URL for the API query is not properly prepared :
```
curl -v --compressed
-H 'Accept-Encoding: gzip'
-H 'Authorization: '
-H 'User-Agent: MY_APP Google-API-Java-Client/2.7.0 Google-HTTP-Java-Client/1.45.0 (gzip)'
-H 'x-goog-api-client: gl-java/21.0.4-graalvm gdcl/2.7.0 linux/6.8.0' -- 'https://admin.googleapis.com/admin/directory/v1/users'
```

instead of

```
curl -v --compressed
-H 'Accept-Encoding: gzip'
-H 'Authorization: '
-H 'User-Agent: MY_APP Google-API-Java-Client/2.7.0 Google-HTTP-Java-Client/1.45.0 (gzip)'
-H 'x-goog-api-client: gl-java/21.0.4-graalvm gdcl/2.7.0 linux/6.8.0' -- 'https://admin.googleapis.com/admin/directory/v1/users?domain=my-domain.com&maxResults=100'
```

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。