네이티브 이미지 컴파일

Java용 Cloud 클라이언트 라이브러리를 사용하여 애플리케이션을 네이티브 이미지로 컴파일할 수 있습니다. 이 접근 방식은 사전 컴파일을 활용하여 애플리케이션의 콜드 스타트 시간과 메모리 사용 공간을 줄임으로써 애플리케이션의 성능을 개선합니다.

클라이언트 라이브러리 버전

Cloud 라이브러리 BOM (libraries-bom) 버전 25.4.0 이상을 사용하거나 2022년 5월 이후에 게시된 클라이언트 라이브러리를 사용해야 합니다.

대부분의 사용자는 libraries-bom를 사용하여 클라이언트 라이브러리 버전을 관리합니다. 이렇게 하면 프로젝트의 모든 클라이언트 라이브러리 버전이 서로 호환되고 최신 상태인지 쉽게 확인할 수 있습니다.

Maven 및 Gradle에서 libraries-bom을 프로젝트에 적용하는 방법에 관한 자세한 내용은 BOM을 사용하도록 프로젝트 업데이트를 참고하세요.

지원되는 라이브러리

지원되는 API 표에 나열된 안정적인 Java용 Google Cloud 클라이언트 라이브러리는 네이티브 이미지 컴파일을 지원합니다.

시작하기 전에

원하는 Java용 Google Cloud 클라이언트 라이브러리와 함께 네이티브 이미지 컴파일을 사용하려면 다음 필수 단계를 따르세요.

  1. 아직 만들지 않았다면 Google Cloud Project를 만듭니다.

  2. 프로젝트의 사용자 인증 정보로 샘플을 실행할 수 있는 Google Cloud CLI를 설치합니다.

  3. Google Cloud CLI를 설치한 후 다음 명령어를 사용하여 애플리케이션 기본 사용자 인증 정보로 로그인합니다.

    gcloud auth application-default login
    
  4. GraalVM과 같은 적절한 JDK 배포를 설치합니다.

  5. 다음 명령어를 실행하여 네이티브 이미지 확장 프로그램을 설치했는지 확인합니다.

    gu install native-image
    
  6. 터미널에서 java -version를 실행하여 기본 Java 버전이 올바르게 설정되었는지 확인합니다. 출력은 다음과 비슷합니다.

    java -version
    openjdk version "17.0.9" 2023-10-17
    OpenJDK Runtime Environment GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22)
    OpenJDK 64-Bit Server VM GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22, mixed mode, sharing)
    

애플리케이션을 네이티브 이미지로 빌드

다음 안내에서는 기본 빌드 도구 플러그인을 사용하여 애플리케이션을 네이티브 이미지로 빌드합니다.

Maven 설정 안내

  1. 이 텍스트를 애플리케이션의 POM에 복사하여 붙여넣어 기본 Maven 플러그인을 사용하여 애플리케이션의 기본 이미지를 빌드합니다. MAIN_CLASS을 기본 클래스 이름으로 바꾸고 VERSION을 네이티브 Maven 플러그인 버전(예: 0.10.1)으로 바꿔야 합니다.

    <profiles>
        <profile>
            <id>native</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>VERSION</version>
                        <extensions>true</extensions>
                        <configuration>
                            <mainClass>$MAIN_CLASS</mainClass>
                            <buildArgs>
                                <buildArg>--no-fallback</buildArg>
                                <buildArg>--no-server</buildArg>
                            </buildArgs>
                        </configuration>
                        <executions>
                            <execution>
                                <id>build-native</id>
                                <goals>
                                    <goal>build</goal>
                                </goals>
                                <phase>package</phase>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    
  2. mvn package -Pnative를 실행하여 ./target 폴더에 네이티브 이미지를 생성합니다.

  3. 실행 파일을 실행하는 것처럼 애플리케이션을 실행합니다. 예를 들면 ./target/$IMAGE_NAME입니다. 플러그인은 기본적으로 프로젝트의 아티팩트 ID를 사용합니다.

Gradle 설정 안내

  1. build.gradle 파일에 다음 텍스트를 붙여넣어 애플리케이션의 기본 클래스를 설정합니다.

    application {
        mainClass.set('$MAIN_CLASS')
    }
    
  2. 플러그인 추가에 설명된 대로 native-gradle 플러그인을 추가합니다.

  3. ./gradlew nativeCompile를 호출하여 네이티브 이미지를 ./build/native/nativeCompile 디렉터리에 빌드합니다.

  4. 애플리케이션을 실행 파일로 실행합니다. 예를 들면 ./build/native/nativeCompile/$PROJECT_NAME입니다. 플러그인을 사용하면 이미지 이름이 기본적으로 프로젝트 이름으로 설정됩니다.

일반적인 문제

SLF4J 호환성

SLF4J 종속 항목이 있는 클라이언트 라이브러리에서 네이티브 이미지 컴파일을 실행하는 경우 다음 빌드 시간 오류가 표시될 수 있습니다.

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing io.grpc.netty.shaded.io.netty.util.internal.SystemPropertyUtil.getBoolean(java.lang.String, boolean)
Parsing context:
   at io.grpc.netty.shaded.io.netty.util.internal.SystemPropertyUtil.getBoolean(SystemPropertyUtil.java:96)
   at io.grpc.netty.shaded.io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:33)
   at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:153)
...
java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of org.slf4j.jul.JDK14LoggerAdapter are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use --trace-object-instantiation=org.slf4j.jul.JDK14LoggerAdapter.

이 문제를 해결하려면 META-INF/native-image/$GROUP_ID/$ARTIFACT_ID/native-image.properties 파일에 --initialize-at-run-time=io.grpc.netty.shaded.io.netty를 추가하세요.

하지만 이 구성은 애플리케이션이 따르는 코드 경로에 따라 생성된 네이티브 이미지의 성능 비용이 발생할 수 있습니다.

또는 Flogger나 java.util.logging 라이브러리와 같은 다른 로깅 라이브러리를 사용하는 것이 좋습니다.

질문

Java 네이티브 이미지 컴파일과 관련된 문제와 질문은 GitHub 문제 페이지에서 신고하세요.

다음 단계