Подтвердить что ты не робот

Заказ Tomcat Classloaders: общий, общий и сервер

Документация Tomcat Class Loader HOW-TO описывает 4 разных загрузчика классов:

  • Bootstrap
  • Система
  • Webapp
  • Общие

Однако в файле Catalina.properties по умолчанию есть свойства, определенные для загрузчика общего и серверного классов. В стандартной версии файла оба этих свойства пусты, а комментарии говорят:

Если оставить пустым, "общий" загрузчик будет использоваться в качестве "общий" / "серверный" загрузчик.

Мне не удалось найти дополнительную документацию об этих загрузчиках классов. Мой вопрос в том, в каком порядке обыскиваются общие и системные загрузчики относительно обычного загрузчика? И дополнительно, каково намеренное использование для этих загрузчиков классов?

4b9b3361

Ответ 1

Недавно я столкнулся с этой проблемой, и вот что я нашел (это все из туловища Tomcat 7)

Во-первых, If left as blank, the "common" loader will be used as Catalina "shared"/"server" loader.

Вот источник ,

89      private void initClassLoaders() {
90          try {
91              commonLoader = createClassLoader("common", null);
92              if( commonLoader == null ) {
93                  // no config file, default to this loader - we might be in a 'single' env.
94                  commonLoader=this.getClass().getClassLoader();
95              }
96              catalinaLoader = createClassLoader("server", commonLoader);
97              sharedLoader = createClassLoader("shared", commonLoader);
98          } catch (Throwable t) {
99              handleThrowable(t);
100             log.error("Class loader creation threw exception", t);
101             System.exit(1);
102         }
103     }

106     private ClassLoader createClassLoader(String name, ClassLoader parent)
107         throws Exception {
108 
109         String value = CatalinaProperties.getProperty(name + ".loader");
110         if ((value == null) || (value.equals("")))
111             return parent;

Итак, если ничего не определено, они возвращаются к использованию записей common.loader.


Что касается порядка загрузки, здесь источник для их загрузки, из source

229         Thread.currentThread().setContextClassLoader(catalinaLoader);
230 
231         SecurityClassLoad.securityClassLoad(catalinaLoader);
232 
233         // Load our startup class and call its process() method
234         if (log.isDebugEnabled())
235             log.debug("Loading startup class");
236         Class<?> startupClass =
237             catalinaLoader.loadClass
238             ("org.apache.catalina.startup.Catalina");
239         Object startupInstance = startupClass.newInstance();
240 
241         // Set the shared extensions class loader
242         if (log.isDebugEnabled())
243             log.debug("Setting startup class properties");
244         String methodName = "setParentClassLoader";
245         Class<?> paramTypes[] = new Class[1];
246         paramTypes[0] = Class.forName("java.lang.ClassLoader");
247         Object paramValues[] = new Object[1];
248         paramValues[0] = sharedLoader;
249         Method method =
250             startupInstance.getClass().getMethod(methodName, paramTypes);
251         method.invoke(startupInstance, paramValues);

Строка 229 устанавливает class.Loader common.loader, тогда строка 251 устанавливает загрузчик классов shared.loader как загрузчик родительского класса Catalinas.

Ответ 2

Странно, Tomcat 5.5 classloader doc по-прежнему имеет обработчик shared, но 6.0 не; ни у вас нет версии v7.0, которую вы цитируете. Может быть, они будут осуждать это?

Мы широко используем общий загрузчик для переопределения существующих классов, которые поставляются с версией нашего программного обеспечения. Программное обеспечение, которое мы делаем, выпускается в выпусках и делает совершенно новую версию для одного клиента (что, скажем, требует критического исправления), слишком дорого (перепроверить все, перестроить, предоставить новую документацию, номер новой версии и т.д.). Итак, вместо этого мы предоставляем "исправление" , которое входит в общий загрузчик и переопределяет соответствующий .class в webapp.

Чаще всего "исправление" - это всего лишь один класс, поэтому общий регрессионный риск минимален.

Когда наше программное обеспечение обновляется, обновление удаляет "исправление" , поскольку исправленный код также будет присутствовать в следующей версии нашего программного обеспечения.

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

Ответ 3

Согласитесь с mindas, группа apache tomcat может рассматривать debrecate server & shared classloader. О заказе webappclassloader и standardclassloader (обычный загрузчик классов) есть интересная публикация, сделанная Jianbo. Он сделал простой тест, чтобы продемонстрировать это. http://web.archive.org/web/20120303091507/http://www.jianbozhu.net/2012/02/14/tomcat-classloader-demonstration/

В основном суть этого заключается в том, что в tomcat загрузчик классов загружает классы из webapp сначала, затем shared/common, затем system.