Details
-
Bug
-
Status: Resolved
-
Critical
-
Resolution: Fixed
-
1.15.3
-
None
-
Linux / GCP
-
Important
Description
Create a new InvokeScriptedProcessor.
Set Module Directory: ./scripts/jars/commons-text-1.6/
- have tried setting absolute & relative paths, paths to directories, paths to jar files, different versions of commons-text, trailing slash/no trailing slash, etc. No differences
Set script engine ECMAScript
Write js script that tries to call a static method in commons-text. Script can be either script file or script body, no difference
Always get ClassNotFoundException error:
Component is invalid: 'ScriptValidation' validated against './scripts/testCsv.js' is invalid because Unable to load script due to java.lang.ClassNotFoundException: org.apache.commons.text.StringEscapeUtils
Definitely not a dupe of https://issues.apache.org/jira/browse/NIFI-9896 - affects both script file & body, error message changes after following the workaround in 9896, plus removing references to org.apache.commons.text.StringEscapeUtils in the script (but still retaining the Module Directory setting) allows the script to function normally.
Have tried Java.type and Packages. to try to access the class.
Any/all help much appreciated as rapidly losing remaining hair!
Sample script:
// base interface & class stuff var Processor = Java.type("org.apache.nifi.processor.Processor") var Relationship = Java.type("org.apache.nifi.processor.Relationship") var HashSet = Java.type("java.util.HashSet") var log = null // stuff to read/write flowfile content var InputStreamCallback = Java.type("org.apache.nifi.processor.io.InputStreamCallback") var OutputStreamCallback = Java.type("org.apache.nifi.processor.io.OutputStreamCallback") var IOUtils = Java.type("org.apache.commons.io.IOUtils") var StandardCharsets = Java.type("java.nio.charset.StandardCharsets") var StringEscapeUtils = Java.type("org.apache.commons.text.StringEscapeUtils") function getPropertyDescriptors() { return []} // =========== Define output relationships ================ var REL_SUCCESS = new Relationship.Builder().name("success").description("FlowFiles that were successfully processed are routed here").build() function getRelationships() { var r = new HashSet() r.add(REL_SUCCESS) return r } //======================================= // Execute the main script when triggered function onTrigger(context, sessionFactory) { var session = sessionFactory.createSession() var flowFile = session.get() if (flowFile !== null) { var test = "boo" test = StringEscapeUtils.escapeCsv("foo") log.warn(test) session.transfer(flowFile, REL_SUCCESS) } session.commit() } // ====================================================== // Other functions required to satisfy interface contract function initialize(context) {log = context.logger} function validate(context) {return null} function getPropertyDescriptor(name) {return getPropertyDescriptors().find(function (property) { return property.getName().equalsIgnoreCase(name) })} function onPropertyModified(descriptor, oldValue, newValue) {return null} function getIdentifier() {return null} processor = this
Attachments
Issue Links
- links to