Пользовательский компилятор загрузчика классов приложения Java EE - PullRequest
0 голосов
/ 07 декабря 2011

Вот требования:

  1. Веб-приложение Java EE (в Tomcat) ...
  2. Очень просто, только JSP, сервлеты и jar - без фреймворков ...
  3. Ничего не нужно перезагружать, ни сервер, ни контекст, ничего ...

Пока что идея состоит в том, чтобы расширить WebappClassLoader (catalina.jar), чтобы сделать свой собственныйпользовательский загрузчик классов и зарегистрируйте его в context.xml как элемент Loader.С небольшим количеством кода вы можете написать свой загрузчик классов, который будет знать, где найти исходные файлы java, а затем скомпилировать их в файлы классов, если это необходимо, и затем загрузить их в память по запросу.Логика проста и понятна.

За исключением:

Как Джаспер узнает, где - автоматически - найти ваши классы, сгенерированные вашим пользовательским загрузчиком классов, чтобы он могкомпилировать JSP, которые ссылаются на них, и даже обновлять их (ваши классы) на лету?Разве это невозможно достичь?

Что вы думаете?

(Пожалуйста, не пытайтесь расходиться, указывая на многочисленные существующие структуры, которые действительно заботятся о такихвещи для вас. Требование очень конкретное: нет рамок, нет ничего)

1 Ответ

0 голосов
/ 12 декабря 2011

Можно добавить загрузчик классов в текущем контексте веб-приложения (context.xml):

<Context>
    <Loader loaderClass = "gr.nevma.cccl.CompilingClassLoader"/>
</Context>

И затем создать загрузчик классов, например:

package package gr.nevma.cccl;

import ...

public class CompilingClassLoader extends WebappClassLoader {

    public CompilingClassLoader ( ClassLoader parentClassLoader ) {

        super( parentClassLoader );

    }

    public Class<?> loadClass ( String className, boolean resolve ) throws ClassNotFoundException { 

        Class<?> theClass = null;

        // Do you stuff here
        return theClass;

    }

}

Но это только поможетесли кто-то хочет иметь возможность явно загружать классы из самого загрузчика классов, вызывая ClassLoader :: loadClass (...).Это не поможет при компиляции JSP Джаспером.Это означает, что, когда Jasper попытается скомпилировать JSP, использующие классы, которые должны были быть загружены этим загрузчиком классов, компиляция завершится неудачей, потому что Jasper даже не попросит этот загрузчик классов загрузить какие-либо классы вообще.Таким образом, автоматическая загрузка и перезагрузка классов может быть достигнута, но в некотором роде - вручную.Эти классы могут быть единообразно использованы во всем веб-приложении, то есть на страницах JSP!

...