1

サーブレットを介して jar を動的にアップロードし、WEB-INF/lib ディレクトリに保存しています。@annotation で注釈を付けたすべてのクラスを取得したいのですが、

以下のリフレクション コードを使用して運が悪かった.. jar のマニフェストは読み取り可能ですが、クラスはそうではありません.. クラスのリストは 0 です

List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
ConfigurationBuilder builder = new ConfigurationBuilder().setScanners(new SubTypesScanner(false), new ResourcesScanner(),
new TypeAnnotationsScanner());
Set<URL> set = ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]));
        FilterBuilder filterBuilder = new FilterBuilder().include(FilterBuilder.prefix(exportPackage));
        Reflections reflections = new Reflections(builder.setUrls(set).filterInputsBy(filterBuilder));

        Set<Class<? extends Object>> classSet = reflections.getTypesAnnotatedWith(MyAnnotation.class);

構成にどのような変更を加えると、動的にアップロードされる jar からクラスを取得するのに役立ちますか..

4

2 に答える 2

0

リスナークラスから (または servletContext が利用可能な場所から)、次を使用してみてください。

new Reflections(ClasspathHelper.forWebInfClasses(servletContext))

また

new Reflections(ClasspathHelper.forWebInfLib(servletContext))
于 2013-03-09T16:54:30.933 に答える
0

独自のディレクトリを更新しているWEB-INF/libため、必ずしもコンテキスト クラス ローダーによってキャッチされるとは限りません。ところで、それは悪い習慣だと思います。動作はアプリケーションサーバーに依存し、このディレクトリはおそらく書き込み可能ではなく、戦争から実行している場合はおそらく存在しません...

そのため、jar を他のディレクトリに置き、カスタム クラス ローダーを使用します。それほど難しくありません。通常使用できます UrlClassLoader。正しいパスからクラスを読み取るように構成するだけです。これが完了したら、 のインスタンスを作成するときに、このクラス ローダーを渡しますReflections。そのjavadcocを見てください。コンストラクターは、クラスローダーを含むさまざまなタイプのパラメーターを除外できます。

于 2012-12-11T13:41:10.410 に答える