特定の WAR ファイルから構成を動的に抽出しようとしています。私の目標は、何らかのインターフェース ( ) を実装するすべてのクラスを見つけることParameter
です。
war ファイルはクラスパスにないため、そのクラスを検査する一時的なクラスローダーを作成します。
URL webClasses = new URL("jar","","file:" + new File(path).getAbsolutePath() + "!/WEB-INF/classes/");
URLClassLoader cl = URLClassLoader.newInstance(new URL[] { webClasses });
Reflections reflections = new Reflections(ClasspathHelper.forClassLoader(cl), new SubTypesScanner(), cl);
Set<Class<? extends Parameter>> params = reflections.getSubTypesOf(Parameter.class);
これはうまくいきます。Parameter
私の webappでのすべての実装を見つけます。
ここで、 に存在する各 jar に対して同じことを行いたいと思いますWEB-INF/lib
。残念ながら、その場合にクラスローダーを構築する方法が見つかりませんでした。クラスローダはjar URLを無視しているようです( jar:<url>!/WEB-INF/lib/{entry}.jar
)。
以下のコードを実行すると、Reflectionsによってクラスが見つかりません。
Set<URL> libs = findLibJars(warUrl));
// The URLs are in the following format : {myWar}.war!/WEB-INF/lib/{myLib}.jar
URLClassLoader cl = URLClassLoader.newInstance(urls.toArray(new URL[urls.size()]));
cl.loadClass("my.company.config.AppParameter");
WEB-INF/lib/*.jar
可能であれば、WAR ファイルから抽出して個別に分析する必要は避けたいと考えています。
ここで何か不足していますか?(他の方法、クラスローダーを作成する他の方法、...リードが役立ちます)。Reflections ライブラリを使用せずにこれを行うことができますか?