Mortom123 opened a new issue, #21069: URL: https://github.com/apache/pulsar/issues/21069
### Search before asking - [X] I searched in the [issues](https://github.com/apache/pulsar/issues) and found nothing similar. ### Version OS: Win10 (Dockerhost), RHEL 8.8 (Container) Pulsar Container Version: "Latest" (as of right now, this points to 3.0.1, running in the container) ### Minimal reproduce step My POM looks somewhat like this: ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" 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> <artifactId>example</artifactId> <groupId>com.example</groupId> <version>0.0.1</version> <name>example</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <kotlin.code.style>official</kotlin.code.style> <java.version>17</java.version> <kotlin.version>1.7.0</kotlin.version> <kotlin.compiler.jvmTarget>${java.version}</kotlin.compiler.jvmTarget> <jackson.version>2.15.2</jackson.version> <pulsar.version>3.0.1</pulsar.version> </properties> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-reflect</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-coroutines-core</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-io-core</artifactId> <version>${pulsar.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>${jackson.version}</version> </dependency> </dependencies> <build> <sourceDirectory>src/main/kotlin</sourceDirectory> <testSourceDirectory>src/test/kotlin</testSourceDirectory> <plugins> <!-- kotlin to java --> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <source>src/main/kotlin</source> <source>target/generated-sources/annotations</source> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <source>src/test/kotlin</source> <source>target/generated-test-sources/test-annotations</source> </sourceDirs> </configuration> </execution> </executions> </plugin> <!-- java to class --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <!-- package nar --> <plugin> <groupId>org.apache.nifi</groupId> <artifactId>nifi-nar-maven-plugin</artifactId> <version>1.5.0</version> <executions> <execution> <id>default-nar</id> <phase>package</phase> <goals> <goal>nar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> ``` The Sink-Implementation looks like this: ```kotlin val mapper: ObjectMapper by lazy { val tmp = jacksonObjectMapper() .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT) // ignore getters / setters (we use kotlin data classes with constructors) tmp.setVisibility( tmp.serializationConfig.defaultVisibilityChecker .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.NONE) ) tmp } inline fun <reified T : Any> parseFromMap(conf: Map<String, Any>): T { return mapper.readValue(mapper.writeValueAsString(conf), T::class.java) } class ExampleSink: Sink<Map<String, Any>> { private lateinit var sinkConfiguration: SinkConfiguration override fun open(config: MutableMap<String, Any>, sinkContext: SinkContext?) { sinkConfiguration = parseFromMap(config) println("HELLO") // just here as an example } override fun write(record: Record<Map<String, Any>>) { // write something } override fun close() { // close something } } ``` The whole pulsar setup is containerized and ran using docker. The project is built using `mvn clean package` and the sink is started using `./pulsar-admin sinks localrun --tenant public --namespace default --sink-type example-archive.nar --name exampleSinkTest --sink-config-file sink-config.yml --inputs test` It is important to use localrun because the sink itself will run in container and requires some native C-Libraries to bind against (not shown here), and I don't want to clutter the pulsar broker container with that. ### What did you expect to see? When providing the sink with a correct configuration, I would expect it to parse this configuration and print "HELLO" afterwards. ### What did you see instead? [root@5a8dbfb1b0f2 bin]# ./pulsar-admin sinks localrun --tenant public --namespace default --sink-type /app/pulsar/bin/*.nar --name exampleSinkTest --sink-config-file /app/pulsar/bin/sink-config.yml --inputs test 2023-08-25T12:41:59,104+0000 [main] INFO org.apache.pulsar.functions.utils.io.ConnectorUtils - Searching for connectors in /app/pulsar/connectors 2023-08-25T12:41:59,110+0000 [main] WARN org.apache.pulsar.functions.utils.io.ConnectorUtils - Connectors archive directory not found 2023-08-25T12:41:59,119+0000 [main] INFO org.apache.pulsar.common.nar.NarUnpacker - Created directory /tmp/pulsar_localrunner_nars_16906245267260121651/pulsar-nar/pulsar-example-connector-0.0.1-DEV.nar-u npacked 2023-08-25T12:42:01,215+0000 [main] INFO org.apache.pulsar.common.nar.NarUnpacker - Extracting /app/pulsar/bin/pulsar-example-connector-0.0.1-DEV.nar to /tmp/pulsar_localrunner_nars_16906245267260121651/ pulsar-nar/pulsar-example-connector-0.0.1-DEV.nar-unpacked/IvmEgg1ISuBuQBaI1r_s2A 2023-08-25T12:42:01,725+0000 [main] INFO org.apache.pulsar.functions.runtime.RuntimeSpawner - public/default/exampleSinkTest-0 RuntimeSpawner starting function 2023-08-25T12:42:01,729+0000 [main] INFO org.apache.pulsar.common.nar.FileUtils - Jar file /app/pulsar/bin/pulsar-example-connector-0.0.1-DEV.nar contains META-INF/bundled-dependencies, it may be a NAR f ile 2023-08-25T12:42:01,730+0000 [main] INFO org.apache.pulsar.functions.runtime.thread.ThreadRuntime - Trying Loading file as NAR file: /app/pulsar/bin/pulsar-example-connector-0.0.1-DEV.nar 2023-08-25T12:42:04,294+0000 [main] INFO org.apache.pulsar.functions.runtime.thread.ThreadRuntime - Initialize function class loader for function exampleSinkTest at function cache manager, functionClassL oader: org.apache.pulsar.common.nar.NarClassLoader[/tmp/pulsar_localrunner_nars_16906245267260121651/pulsar-nar/pulsar-example-connector-0.0.1-DEV.nar-unpacked/IvmEgg1ISuBuQBaI1r_s2A] 2023-08-25T12:42:04,300+0000 [main] INFO org.apache.pulsar.functions.runtime.thread.ThreadRuntime - ThreadContainer starting function with instanceId 0 functionId 1bc65d9d-1216-4c8f-9eca-e3cd849a4af1 n amespace default 2023-08-25T12:42:34,303+0000 [function-timer-thread-28-1] ERROR org.apache.pulsar.functions.runtime.RuntimeSpawner - public/default/exampleSinkTest Function Container is dead with following exception. Res tarting. kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath at kotlin.jvm.internal.ClassReference.error(ClassReference.kt:88) ~[org.jetbrains.kotlin-kotlin-stdlib-1.6.0.jar:1.6.0-release-798(1.6.0)] at kotlin.jvm.internal.ClassReference.getConstructors(ClassReference.kt:21) ~[org.jetbrains.kotlin-kotlin-stdlib-1.6.0.jar:1.6.0-release-798(1.6.0)] at kotlin.reflect.jvm.ReflectJvmMapping.getKotlinFunction(ReflectJvmMapping.kt:146) ~[?:?] at com.fasterxml.jackson.module.kotlin.KotlinNamesAnnotationIntrospector.findKotlinParameterName(KotlinNamesAnnotationIntrospector.kt:108) ~[?:?] at com.fasterxml.jackson.module.kotlin.KotlinNamesAnnotationIntrospector.findImplicitPropertyName(KotlinNamesAnnotationIntrospector.kt:57) ~[?:?] at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findImplicitPropertyName(AnnotationIntrospectorPair.java:502) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.1 4.2] at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addCreatorParam(POJOPropertiesCollector.java:643) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addCreators(POJOPropertiesCollector.java:623) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:431) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:391) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:233) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:328) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:272) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2. 14.2] at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:223) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:262) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:151) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:415) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:350) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:648) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4861) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4731) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3677) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3645) ~[com.fasterxml.jackson.core-jackson-databind-2.14.2.jar:2.14.2] at com.example.example.ExampleSink.open(ExampleSink.kt:62) ~[?:?] at org.apache.pulsar.functions.instance.JavaInstanceRunnable.setupOutput(JavaInstanceRunnable.java:943) ~[org.apache.pulsar-pulsar-functions-instance-3.0.1.jar:3.0.1] at org.apache.pulsar.functions.instance.JavaInstanceRunnable.setup(JavaInstanceRunnable.java:251) ~[org.apache.pulsar-pulsar-functions-instance-3.0.1.jar:3.0.1] at org.apache.pulsar.functions.instance.JavaInstanceRunnable.run(JavaInstanceRunnable.java:290) ~[org.apache.pulsar-pulsar-functions-instance-3.0.1.jar:3.0.1] at java.lang.Thread.run(Thread.java:833) ~[?:?] ### Anything else? The content of META-INF in the .nar archive looks like this: META-INF/bundled-dependencies/annotations-13.0.jar META-INF/bundled-dependencies/jackson-annotations-2.15.2.jar META-INF/bundled-dependencies/jackson-core-2.15.2.jar META-INF/bundled-dependencies/jackson-databind-2.15.2.jar META-INF/bundled-dependencies/jackson-module-kotlin-2.15.2.jar META-INF/bundled-dependencies/kotlin-reflect-1.7.0.jar META-INF/bundled-dependencies/kotlin-stdlib-1.7.0.jar META-INF/bundled-dependencies/kotlin-stdlib-common-1.7.0.jar META-INF/bundled-dependencies/kotlin-stdlib-jdk7-1.8.20.jar META-INF/bundled-dependencies/kotlin-stdlib-jdk8-1.8.20.jar META-INF/bundled-dependencies/kotlinx-coroutines-core-1.7.0.jar META-INF/bundled-dependencies/kotlinx-coroutines-core-jvm-1.7.0.jar META-INF/bundled-dependencies/pulsar-client-admin-api-3.0.1.jar META-INF/bundled-dependencies/pulsar-client-api-3.0.1.jar META-INF/bundled-dependencies/pulsar-functions-api-3.0.1.jar META-INF/bundled-dependencies/pulsar-io-core-3.0.1.jar META-INF/bundled-dependencies/slf4j-api-2.0.4.jar META-INF/pulsar-example-connector.kotlin_module META-INF/services/pulsar-io.yaml META-INF/maven/com.example/pulsar-example-connector/pom.xml META-INF/maven/com.example/pulsar-example-connector/pom.properties ### Are you willing to submit a PR? - [ ] I'm willing to submit a PR! -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
