apache/seatunnel · warning

Cannot get plugin URL for pluginIdentifier: {}

Error message

Cannot get plugin URL for pluginIdentifier: {}

What it means

findMatchingUrl matches a plugin identifier to a jar file and converts the file to a URL. If file.toURI().toURL() throws MalformedURLException (malformed path, e.g., illegal characters or a non-absolute/odd URI), the match for that file is skipped and this warning is logged.

Source

Thrown at seatunnel-plugin-discovery/src/main/java/org/apache/seatunnel/plugin/discovery/AbstractPluginDiscovery.java:579

        if (pluginInstanceMap == null) {
            return Optional.empty();
        }
        List<PluginIdentifier> matchedIdentifier = new ArrayList<>();
        for (Map.Entry<PluginIdentifier, String> entry : pluginInstanceMap.entrySet()) {
            if (file.getName().startsWith(entry.getValue())) {
                matchedIdentifier.add(entry.getKey());
            }
        }

        try {
            if (matchedIdentifier.size() == 1) {
                return Optional.of(file.toURI().toURL());
            }
            if (pluginName.contains("cdc") && file.getName().startsWith("connector-cdc-base")) {
                return Optional.of(file.toURI().toURL());
            }
        } catch (MalformedURLException e) {
            log.warn("Cannot get plugin URL for pluginIdentifier: {}", file, e);
        }

        if (log.isDebugEnabled()) {
            log.debug(
                    "File found: {}, matches more than one PluginIdentifier: {}",
                    file.getName(),
                    matchedIdentifier);
        }
        return Optional.empty();
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Rename the SeaTunnel installation path to remove spaces/special characters (e.g., /opt/seatunnel)
  2. Ensure connector jars are directly under the connectors dir without broken symlinks
  3. Check which 'file' value appears in the warning to locate the offending path
  4. On Windows, verify the path is absolute and drive letter formatted correctly

Example fix

// before
String dir = "/opt/My Tools/seatunnel"; // space breaks URL
// after
String dir = "/opt/seatunnel";
Defensive patterns

Strategy: validation

Validate before calling

Path p = Paths.get(pluginDir).toAbsolutePath().normalize();
if (p.toString().matches(".*[\\s#?].*")) log.warn("path may break URL conversion: {}", p);

Try / catch

try { new File(path).toURI().toURL(); } catch (MalformedURLException e) { /* rename path without special chars */ }

Prevention

When it happens

Trigger: A jar path in the plugin directory yields a malformed URI — spaces/illegal characters unencoded in the path, or a filesystem path that cannot be converted by toURI().toURL().

Common situations: Plugin installed in a directory containing spaces or special characters; symlink targets with invalid URL characters; Windows paths with unusual drive letter handling.

Understand the failure class

Background: "Invalid URL" / "URL cannot be empty": fix the malformed or missing URL behind request-construction failures — this error's family across 50 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/14a3fb73cd32821b. Report an issue: GitHub.