public void deregister(String pluginName, boolean needToDeleteJar) throws PipeException {
    lock.lock();
    try {
      final PipePluginMeta information = pipePluginMetaKeeper.getPipePluginMeta(pluginName);

      if (information != null && information.isBuiltin()) {
        String errorMessage =
            String.format("Failed to deregister builtin PipePlugin %s.", pluginName);
        LOGGER.warn(errorMessage);
        throw new PipeException(errorMessage);
      }

      // remove anyway
      pipePluginMetaKeeper.removePipePluginMeta(pluginName);
      pipePluginMetaKeeper.removePipePluginVisibility(pluginName);
      PipePluginClassLoaderManager.getInstance().removePluginClassLoader(pluginName);

      // if it is needed to delete jar file of the pipe plugin, delete both jar file and md5
      if (information != null && needToDeleteJar) {
        PipePluginExecutableManager.getInstance()
            .removePluginFileUnderLibRoot(information.getPluginName(), information.getJarName());
        PipePluginExecutableManager.getInstance()
            .removeFileUnderTemporaryRoot(pluginName.toUpperCase() + ".txt");
      }
    } catch (IOException e) {
      throw new PipeException(e.getMessage(), e);
    } finally {
      lock.unlock();
    }
  }
Register a PipePlugin to the system without any meta checks. The PipePlugin will be loaded by
the PipePluginClassLoader and its instance will be created to ensure that it can be loaded.

@param pipePluginMeta the meta information of the PipePlugin
@throws PipeException if the PipePlugin can not be loaded or its instance can not be created
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/agent/plugin/PipeDataNodePluginAgent.java