Source:
<code>private void runNodeUpdater() throws ExecutionFailedException, MojoExecutionException { Set<File> jarFiles = project.getArtifacts().stream() .filter(artifact -> "jar".equals(artifact.getType())) .map(Artifact::getFile).collect(Collectors.toSet()); File flowResourcesFolder = new File(npmFolder, DEFAULT_FLOW_RESOURCES_FOLDER); final URI nodeDownloadRootURI; try { nodeDownloadRootURI = new URI(nodeDownloadRoot); } catch (URISyntaxException e) { throw new MojoExecutionException("Failed to parse " + nodeDownloadRoot, e); } ClassFinder classFinder = getClassFinder(project); Lookup lookup= createLookup(classFinder); <START> new NodeTasks.Builder(lookup, classFinder, <END> npmFolder, generatedFolder, frontendDirectory) .runNpmInstall(runNpmInstall) .useV14Bootstrap(useDeprecatedV14Bootstrapping()) .enablePackagesUpdate(true) .useByteCodeScanner(optimizeBundle) .withFlowResourcesFolder(flowResourcesFolder) .copyResources(jarFiles) .copyLocalResources(frontendResourcesDirectory) .enableImportsUpdate(true) .withEmbeddableWebComponents( generateEmbeddableWebComponents) .withTokenFile(getTokenFile()).enablePnpm(pnpmEnable) .withConnectApplicationProperties( applicationProperties) .withConnectJavaSourceFolder(javaSourceFolder) .withConnectGeneratedOpenApiJson(openApiJsonFile) .withConnectClientTsApiFolder(generatedTsFolder) .withHomeNodeExecRequired(requireHomeNodeExec) .withNodeVersion(nodeVersion) .withNodeDownloadRoot(nodeDownloadRootURI) .build() .execute(); }</code><technical_language>I avoid passing ClassFinder a separate parameter everywhere. Lookup created return ClassFinder ClassFinder.class. implement this wait for <LINK_0> I introduced static methods Lookup allows extend it. this is important</technical_language>

Target:
private void runNodeUpdater() throws ExecutionFailedException, MojoExecutionException { Set<File> jarFiles = project.getArtifacts().stream() .filter(artifact -> "jar".equals(artifact.getType())) .map(Artifact::getFile).collect(Collectors.toSet()); File flowResourcesFolder = new File(npmFolder, DEFAULT_FLOW_RESOURCES_FOLDER); final URI nodeDownloadRootURI; try { nodeDownloadRootURI = new URI(nodeDownloadRoot); } catch (URISyntaxException e) { throw new MojoExecutionException("Failed to parse " + nodeDownloadRoot, e); } ClassFinder classFinder = getClassFinder(project); Lookup lookup= createLookup(classFinder); new NodeTasks.Builder(lookup, npmFolder, generatedFolder, frontendDirectory) .runNpmInstall(runNpmInstall) .useV14Bootstrap(useDeprecatedV14Bootstrapping()) .enablePackagesUpdate(true) .useByteCodeScanner(optimizeBundle) .withFlowResourcesFolder(flowResourcesFolder) .copyResources(jarFiles) .copyLocalResources(frontendResourcesDirectory) .enableImportsUpdate(true) .withEmbeddableWebComponents( generateEmbeddableWebComponents) .withTokenFile(getTokenFile()).enablePnpm(pnpmEnable) .withConnectApplicationProperties( applicationProperties) .withConnectJavaSourceFolder(javaSourceFolder) .withConnectGeneratedOpenApiJson(openApiJsonFile) .withConnectClientTsApiFolder(generatedTsFolder) .withHomeNodeExecRequired(requireHomeNodeExec) .withNodeVersion(nodeVersion) .withNodeDownloadRoot(nodeDownloadRootURI) .build() .execute(); }