我有一个 Maven 应用程序,我喜欢使用该ServiceLoader
机制来加载插件。
目前,我通过将依赖项添加到 pom 来实现这一点,以便依赖项 jar 在类路径中,并且 ServiceLoader 可以将其拾取。
但是,如果不在 pom 中声明依赖关系,如何实现呢?
我不喜欢用每个要使用的插件来改变 pom。
我该怎么做 - 或者插件 jar 必须始终在 pom 中?
我有一个 Maven 应用程序,我喜欢使用该ServiceLoader
机制来加载插件。
目前,我通过将依赖项添加到 pom 来实现这一点,以便依赖项 jar 在类路径中,并且 ServiceLoader 可以将其拾取。
但是,如果不在 pom 中声明依赖关系,如何实现呢?
我不喜欢用每个要使用的插件来改变 pom。
我该怎么做 - 或者插件 jar 必须始终在 pom 中?
我瞎了...
我可以简单地使用URLClassloader
来从我的应用程序的文件夹中加载所有插件 jar。
public class IntegrationServiceLoader {
public static <T> ServiceLoader<T> loadIntegrations(Path path, Class<T> clazz) {
List<URL> fileNames = new ArrayList<>();
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path)) {
for (Path each : directoryStream) {
fileNames.add(each.toUri().toURL());
}
} catch (IOException ex) {
}
URL[] array = fileNames.stream().toArray(size -> new URL[size]);
ClassLoader cl = new URLClassLoader(array, IntegrationServiceLoader.class.getClassLoader());
return ServiceLoader.load(clazz, cl);
}
}
这是有效的,现在适用于设置。