0

ServiceLoaderMaven アプリケーションがあり、このメカニズムを使用してプラグインをロードするのが好きです。

現在、依存関係をpomに追加することでこれを実現しているため、依存関係のjarがクラスパスにあり、ServiceLoaderがそれを取得できます。

しかし、 pom で依存関係を宣言せずにこれをどのように達成できますか?

使用するすべてのプラグインで pom を変更するのは好きではありません。

どうすればこれを行うことができますか、またはプラグイン jar は常に pom にある必要がありますか?

4

1 に答える 1

0

私は盲目でした...

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);
    }
}

これは有効であり、現在のセットアップで機能します。

于 2016-05-23T22:08:11.247 に答える