Java 함수 패키징하기
Java 함수 패키징하기
Java 함수는 JAR 방식과 NAR 방식 두 가지로 패키징할 수 있어요. JAR은 단순한 함수에, NAR은 내장 함수(built-in)로 배포하거나 의존성·라이선스 관리를 깔끔하게 하고 싶을 때 사용하면 좋아요.
함수를 패키징해서 다른 사람이 쓰도록 배포할 계획이라면, 자신의 코드 라이선스와 저작권을 제대로 명시해야 해요. 런타임 Java 버전은 대상 Pulsar 버전에 따라 Pulsar 런타임 Java 버전 권장 사항을 참고하세요.
출처: 문서
본문
만약 함수를 패키징해서 다른 사람이 사용하도록 배포할 계획이라면, 자신의 코드 라이선스와 저작권을 제대로 명시해야 해요. 코드가 사용하는 모든 라이브러리와 배포본에 라이선스와 저작권을 반드시 추가하세요.
NAR 방식을 사용하면 NAR 플러그인이 생성된 NAR 패키지 안에 DEPENDENCIES 파일을 자동으로 만들어, 함수의 모든 라이브러리의 올바른 라이선스와 저작권을 포함해 줘요.
런타임 Java 버전은 대상 Pulsar 버전에 따라 Pulsar 런타임 Java 버전 권장 사항을 참고해요.
Java 함수를 패키징하는 방법은 두 가지예요.
JAR로 패키징 (Package as JAR)
Java 함수를 JAR로 패키징하려면 다음 단계를 완료해요.
- pom 파일과 함께 새 Maven 프로젝트를 만들어요. 아래 코드 샘플에서
mainClass의 값은 패키지 이름이에요.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>java-function</groupId>
<artifactId>java-function</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-functions-api</artifactId>
<version>5.0.0-M2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.example.test.ExclamationFunction</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
- Java 함수를 패키징해요.
mvn package
Java 함수가 패키징되면 target 디렉터리가 자동으로 생성돼요. target 디렉터리를 열어 java-function-1.0-SNAPSHOT.jar 같은 JAR 패키지가 있는지 확인해요.
- 다음 명령으로 Java 함수를 실행해요.
./bin/pulsar-admin functions localrun \
--classname org.example.test.ExclamationFunction \
--jar $PWD/target/java-function-1.0-SNAPSHOT.jar \
--inputs persistent://public/default/my-topic-1 \
--output persistent://public/default/test-1 \
--tenant public \
--namespace default \
--name JavaFunction
다음 로그는 Java 함수가 성공적으로 시작되었음을 나타내요.
...
07:55:03.724 [main] INFO org.apache.pulsar.functions.runtime.ProcessRuntime - Started process successfully
...
NAR로 패키징 (Package as NAR)
Java 함수를 NAR로 패키징하려면 다음 단계를 완료해요.
- pom 파일과 함께 새 Maven 프로젝트를 만들어요.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>java-function</groupId>
<artifactId>java-function</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-functions-api</artifactId>
<version>5.0.0-M2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-nar-maven-plugin</artifactId>
<version>1.5.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
또한 resources/META-INF/services/pulsar-io.yaml 파일을 만들어야 해요. 아래 코드 샘플에서 functionClass의 값은 함수 클래스 이름이고, name은 함수를 내장 함수로 배포할 때 사용되는 이름이에요.
name: java-function
description: my java function
functionClass: org.example.test.ExclamationFunction
- Java 함수를 패키징해요.
mvn package
Java 함수가 패키징되면 target 디렉터리가 자동으로 생성돼요. target 디렉터리를 열어 java-function-1.0-SNAPSHOT.nar 같은 NAR 패키지가 있는지 확인해요.
- 다음 명령으로 Java 함수를 실행해요.
./bin/pulsar-admin functions localrun \
--jar $PWD/target/java-function-1.0-SNAPSHOT.nar \
--inputs persistent://public/default/my-topic-1 \
--output persistent://public/default/test-1 \
--tenant public \
--namespace default \
--name JavaFunction
다음 로그는 Java 함수가 성공적으로 시작되었음을 나타내요.
...
07:55:03.724 [main] INFO org.apache.pulsar.functions.runtime.ProcessRuntime - Started process successfully
...
더 알아보기 (Learn more)
- 함수 패키징의 전체 흐름이 궁금하다면 함수 패키징 문서를 참고해요.
- Python 함수 패키징 방법은 Python 함수 패키징 문서를 살펴보세요.
- Go 함수 패키징 방법은 Go 함수 패키징 문서에서 확인할 수 있어요.