На сервере Tomcat 5.5 я помещаю класс в системный путь к классам (и изменяю Catalina.bat, чтобы выбрать его), или если я помещаю класс в каталог общей библиотеки lib. Теперь, если у меня есть два разных приложения, использующих тот же класс, который не имеет класса в своих каталогах lib/classes WEB-INF, они используют один и тот же экземпляр класса. Я понимаю, что classloader будет делегировать ему родительский загрузчик классов для поиска класса, если он не может его найти, поэтому в этом случае, поскольку класс отсутствует в WEB-INF/classes или WEB-INF/lib, Загрузчик классов WebAppX будет использовать общий, общий и системный загрузчик классов соответственно.
Однако мне как-то кажется странным, что два разных приложения могут использовать контекст, используя этот метод. Может ли кто-нибудь помочь мне понять, почему это так. например в нижнем коде два сервлета развертываются в отдельных войнах, в то время как CommonCounter является общим, и они могут считывать значения счетчика, увеличенные другим.
Edit Мне кажется, что интуитивно понятно, что два отдельных приложения могут использовать контекст таким образом. Фактически, если у них есть один и тот же экземпляр класса, они могут даже реализовать многопоточность/синхронизацию в двух разных приложениях, что кажется чрезвычайно противоречивым.
package com.test;
public class CommonCounter {
public static int servlet1;
public static int servlet2;
}
public class Servlet1 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CommonCounter.servlet1++;
System.out.println("Other one had "+CommonCounter.servlet2+" hits");
}
}
public class Servlet2 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CommonCounter.servlet2++;
System.out.println("Other one had "+CommonCounter.servlet1+" hits");
}
}