Maven으로 프로젝트 구성하기
Maven으로 프로젝트 구성하기 (How to use Maven to configure your project)
이 가이드는 Apache Software Foundation이 개발한 오픈소스 빌드 자동화 도구인 Maven으로 Flink 작업 프로젝트를 구성하는 방법을 보여줘요. Maven을 사용해 프로젝트의 전체 수명주기를 관리할 수 있어요.
출처: 문서
본문
요구사항 (Requirements)
- Maven 3.8.6
- Java 11
프로젝트를 IDE로 가져오기 (Importing the project into your IDE)
프로젝트 폴더와 파일을 만든 후에는 개발과 테스트를 위해 이 프로젝트를 IDE로 가져오는 것을 권장해요. IntelliJ IDEA는 Maven 프로젝트를 기본 지원해요. Eclipse는 m2e 플러그인으로 Maven 프로젝트를 가져올 수 있어요.
참고: Java의 기본 JVM 힙 크기는 Flink에 너무 작을 수 있어 수동으로 늘려야 해요. Eclipse에서는 Run Configurations → Arguments로 가서 VM Arguments 상자에
-Xmx800m을 입력해요. IntelliJ IDEA에서 JVM 옵션을 바꾸는 권장 방법은 Help | Edit Custom VM Options 메뉴예요. 자세한 내용은 이 문서를 참고해요.
IntelliJ 참고: IntelliJ IDEA에서 애플리케이션을 실행하려면 실행 구성에서
Include dependencies with "Provided" scope상자를 체크해야 해요. 이 옵션을 쓸 수 없다면(오래된 IntelliJ IDEA 버전 때문일 수 있음) 애플리케이션의main()메서드를 호출하는 테스트를 만드는 방법이 있습니다.
프로젝트 빌드하기 (Building the project)
프로젝트를 빌드/패키징하려면 프로젝트 디렉터리로 이동해 mvn clean package 명령을 실행해요. 애플리케이션(및 애플리케이션에 의존성으로 추가했을 수 있는 커넥터·라이브러리)을 포함한 JAR 파일을 target/<artifact-id>-<version>.jar에서 찾을 수 있어요.
참고: 애플리케이션의 main 클래스/진입점으로 DataStreamJob과 다른 클래스를 사용했다면 pom.xml의
mainClass설정을 그에 맞게 바꿔서 Flink가 main 클래스를 따로 지정하지 않고도 JAR 파일에서 애플리케이션을 실행할 수 있게 하는 것을 권장해요.
프로젝트에 의존성 추가하기 (Adding dependencies to the project)
프로젝트 디렉터리의 pom.xml 파일을 열고 dependencies 탭 사이에 의존성을 추가해요. 예를 들어 Kafka 커넥터를 의존성으로 추가할 수 있어요:
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
그런 다음 커맨드라인에서 mvn install을 실행해요.
Java Project Template이나 Gradle로 만든 프로젝트는 mvn clean package를 실행할 때 애플리케이션 의존성을 애플리케이션 JAR에 자동으로 포함하도록 구성돼요. 이 템플릿들로 만들지 않은 프로젝트는 필요한 모든 의존성과 함께 애플리케이션 jar를 빌드하도록 Maven Shade Plugin을 추가하는 것을 권장해요.
중요: 이 모든 핵심 API 의존성은 scope를 provided로 설정해야 해요. 즉 컴파일에는 필요하지만 결과 애플리케이션 JAR 파일에는 패키징되면 안 된다는 뜻이에요. provided로 설정하지 않으면, 좋은 경우에도 모든 Flink 핵심 의존성이 포함되어 결과 JAR이 과도하게 커져요. 최악의 경우 애플리케이션 JAR에 추가된 Flink 핵심 의존성이 사용자의 자체 의존성 버전과 충돌할 수 있어요(보통 역방향 클래스로딩으로 피해짐).
애플리케이션 JAR로 의존성을 올바르게 패키징하려면 Flink API 의존성을 compile scope로 설정해야 해요.
애플리케이션 패키징하기 (Packaging the application)
사용 사례에 따라 Flink 환경에 배포하기 전에 Flink 애플리케이션을 다르게 패키징해야 할 수 있어요.
제3자 의존성 없이 Flink 의존성만 사용하는 Flink Job용 JAR을 만들고 싶다면(예: JSON 포맷의 filesystem 커넥터 사용) uber/fat JAR을 만들거나 의존성을 shade할 필요가 없어요.
Flink 배포에 내장되지 않은 외부 의존성을 사용하는 Flink Job용 JAR을 만들고 싶다면 배포의 클래스패스에 추가하거나 uber/fat 애플리케이션 JAR에 shade할 수 있어요. 생성된 uber/fat JAR은 다음으로 로컬 또는 원격 클러스터에 제출할 수 있어요:
bin/flink run -c org.example.MyJob myFatJar.jar
Flink 작업 배포 방법을 더 배우려면 배포 가이드를 참고해요.
의존성이 있는 uber/fat JAR 생성 템플릿 (Template for creating an uber/fat JAR with dependencies)
선언된 커넥터와 라이브러리에 필요한 모든 의존성을 포함한 애플리케이션 JAR을 빌드하려면 다음 shade 플러그인 정의를 사용할 수 있어요:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>com.google.code.findbugs:jsr305</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<!-- Do not copy the signatures in the META-INF folder.
Otherwise, this might cause SecurityExceptions when using the JAR. -->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- Replace this with the main class of your job -->
<mainClass>my.programs.main.clazz</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Maven shade 플러그인은 기본적으로 "runtime"과 "compile" scope의 모든 의존성을 포함해요.