2016-05-23 6 views
0

私はmavenアプリケーションを持っていますので、ServiceLoaderメカニズムを使用してプラグインをロードします。依存関係がpomに指定されていない場合のmavenのServiceLoader

現在、私はpomに依存関係を追加することでこれを達成しています。これにより、依存関係jarがクラスパスにあり、ServiceLoaderがそれを受け取ることができます。

しかし、これはpomの依存関係を宣言することなくどのように達成できますか?

私は、使用するすべてのプラグインでpomを変更したくありません。

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

+0

アプリケーションをどのように実行していますか? –

+0

現在、私は 'GrizzlyHttpServerFactory.createHttpServer'を使ってサーバを作成しています。その 'ResourceConfig'は' ServiceLoader'を介してプラグインをロードします。私は、より安定したアイディアが風袋や類似のものを使用することになると思います。 –

+0

JARを構築していますか?もしそうなら、あなたはそれをどうやって走っていますか?これらのプラグインを手動でダウンロードしてクラスパスに追加することはできますが、Mavenがあなたの心を読んでPOMに宣言することなくそれらのプラグインを表示する方法はありません。 –

答えて

0

私は単に自分のアプリケーションのフォルダからすべてのプラグインのjarファイルをロードするためにURLClassloaderを使用することができます...

盲目でした。

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

これは有効であり、今セットアップに有効です。

関連する問題