Загрузка классов из 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, Посмотрите на свой ага Конструктор может исключать различные типы параметров, включая загрузчик классов.

Другие вопросы по тегам