Загрузка классов из jar-файла, который динамически загружается через сервлет
Я загружаю jar динамически через сервлет и сохраняю его в моем каталоге WEB-INF/lib. Я хочу, чтобы все классы были помечены моей аннотацией,
Я использовал приведенный ниже код отражения без какой-либо удачи. Манифест фляги читабелен, но классы нет. Список классов равен 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, который загружается динамически.
2 ответа
Из вашего класса слушателя (или из любого доступного servletContext) попробуйте использовать:
new Reflections(ClasspathHelper.forWebInfClasses(servletContext))
или же
new Reflections(ClasspathHelper.forWebInfLib(servletContext))
Так как вы обновляете свой собственный WEB-INF/lib
каталог не обязательно перехватывается вашим загрузчиком класса контекста. Кстати, я думаю, что это плохая практика: поведение зависит от сервера приложений, и этот каталог, вероятно, недоступен для записи и даже, вероятно, не существует, если вы работаете с войны...
Итак, я бы поместил банку в другой каталог и использовал свой загрузчик пользовательских классов. Это не так сложно. Вы можете использовать обычные UrlClassLoader
, Просто настройте его для чтения классов с правильного пути. Как только это будет сделано, передайте этот загрузчик классов при создании экземпляра Reflections
, Посмотрите на свой ага Конструктор может исключать различные типы параметров, включая загрузчик классов.