Динамически загружать плагины с различными версиями интерфейса плагина в Scala - PullRequest
0 голосов
/ 06 июля 2019

У меня есть приложение, которое загружает плагины из внешних jar-файлов, и до сих пор у меня была только одна версия интерфейса плагина, однако теперь мне нужно добавить новую функцию в интерфейс, но я все еще хочу поддерживатьстарые плагины.

Я не могу узнать, как определить, какую версию интерфейса моего плагина реализует jar, а также как создать правильную версию?

Мой текущий загрузчик плагинов (упрощенный) выглядиткак это:

def init(pluginPath: String): Unit = {
    val dir = new File(pluginPath)
    if (dir.exists && dir.isDirectory) {
      val jarFiles = dir.listFiles().filter(file => file.isFile && file.getName.endsWith(".jar"))
      jarFiles.foreach(jarFile => {
        println(s"File: ${jarFile.getName}")
        // Jar manifest info
        val mainAttr = (new JarFile(jarFile)).getManifest.getMainAttributes
        val implTitle = mainAttr.getValue("Implementation-Title")
        val implVersion = mainAttr.getValue("Implementation-Version")
        println(s"=== ${implTitle} - ${implVersion} ===")
        // Reflection
        val finder = ClassFinder(Seq(jarFile))
        val classes = finder.getClasses()
        val classMap = ClassFinder.classInfoMap(classes)
        // Plugins
        val plugins = ClassFinder.concreteSubclasses("org.example.shared.plugin", classMap)
        // Class loader
        val classLoader = new URLClassLoader(Seq(jarFile.toURI.toURL), getClass.getClassLoader)
        plugins.foreach(pluginString => {
          val plugin = classLoader.loadClass(pluginString.name).newInstance().asInstanceOf[plugin]
          println(s"Name: ${pluginString.name}")
          println(s"Plugin: ${plugin.getSchema}")
        })
      })
    } else {
      println(s"Could not load from path: ${pluginPath}")
    }
  }

Я работаю с предположением, что мой плагин должен расширять простую черту trait plugin extends pluginBase { ... } так, чтобы я мог также находить и создавать их экземпляры из разных jar-файлов, но как связать все этовместе.

Любое предложение о том, что я могу посмотреть на это сделать для этого?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...