Skip to main content
Version: 4.0.x

Java 函数包

note

如果你计划打包并分发你的函数供他人使用,你有义务正确地许可和版权保护你自己的代码。记得为你代码使用的所有库以及你的分发添加许可和版权信息。

如果您使用NAR方法,NAR插件会自动在生成的NAR包中创建一个DEPENDENCIES文件,包括您函数所有库的适当许可和版权。

关于运行时Java版本,请根据您的目标Pulsar版本参考Pulsar Runtime Java Version Recommendation

有两种打包Java函数的方法:

打包为JAR

要将Java函数打包为JAR,请完成以下步骤。

  1. 创建一个带有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>4.0.1</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>
  2. 打包你的Java函数。

     mvn package

    Java函数打包后,会自动创建一个target目录。打开target目录,检查是否存在类似于java-function-1.0-SNAPSHOT.jar的JAR包。

  3. 使用以下命令运行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

要将Java函数打包为NAR,请完成以下步骤。

  1. 使用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>4.0.1</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
  2. 打包你的Java函数。

    mvn package

    Java函数打包后,会自动创建一个target目录。打开target目录,检查是否存在类似于java-function-1.0-SNAPSHOT.nar的NAR包。

  3. 使用以下命令运行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
    ...