У меня есть приложение, которое загружает плагины из внешних 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-файлов, но как связать все этовместе.
Любое предложение о том, что я могу посмотреть на это сделать для этого?
Спасибо.