Порядок загрузчиков классов Tomcat: общий, общий и серверный - PullRequest
16 голосов
/ 06 июня 2011

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

  1. Bootstrap
  2. System
  3. Common
  4. Webapp

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

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

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

Ответы [ 3 ]

10 голосов
/ 01 ноября 2011

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

Если оставить это поле пустым, «обычный» загрузчик будет использоваться какЗагрузчик Catalina "shared" / "server".

Вот соответствующий источник ,

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.oader common.loader, затем строка 251 устанавливает загрузчик классов shared.loader в качестве загрузчика родительского класса Catalinas.

1 голос
/ 16 февраля 2012

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

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

1 голос
/ 07 июня 2011

Странно, Документация по загрузке классов Tomcat 5.5 все еще имеет документированный загрузчик shared, но 6.0 не ; ни один не имеет v7.0, который вы цитируете. Может быть, они собираются осудить это?

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

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

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

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

...