Tomcat-ConfigContext监听器(Context.xml,web.xml)

Tomcat的Host初始化(Context,Listener,Filter,Servlet):[url]http://donald-draper.iteye.com/blog/2327174[/url]
Host作为Engine的子容器,在Host中有两个变量为StandardContext和
configClass,StandardContext在前文中我们已经讲过了,
public class StandardHost extends ContainerBase implements Host {
/**
* The Java class name of the default context configuration class
* for deployed web applications.
*/
private String configClass =
"org.apache.catalina.startup.ContextConfig";
/**
* The Java class name of the default Context implementation class for
* deployed web applications.
*/
private String contextClass =
"org.apache.catalina.core.StandardContext";
}

现在我们,来看看org.apache.catalina.startup.ContextConfig都做了些什么?
public class ContextConfig implements LifecycleListener {
/**
* The set of Authenticators that we know how to configure. The key is
* the name of the implemented authentication method, and the value is
* the fully qualified Java class name of the corresponding Valve.
*/
protected static final Properties authenticators;
/**
* The list of JARs that will be skipped when scanning a web application
* for JARs. This means the JAR will not be scanned for web fragments, SCIs,
* annotations or classes that match @HandlesTypes.
*/
private static final Set<String> pluggabilityJarsToSkip =
new HashSet<String>();

static {
// Load our mapping properties for the standard authenticators
Properties props = new Properties();
InputStream is = null;
try {
//加载Authenticators.properties
is = ContextConfig.class.getClassLoader().getResourceAsStream(
"org/apache/catalina/startup/Authenticators.properties");
if (is != null) {
props.load(is);
}
}
authenticators = props;
//Load the list of JARS to skip
addJarsToSkip(Constants.DEFAULT_JARS_TO_SKIP);
addJarsToSkip(Constants.PLUGGABILITY_JARS_TO_SKIP);
}
/**
* 每个Host的默认web.xml配置缓存
*/
protected static final Map<Host,DefaultWebXmlCacheEntry> hostWebXmlCache =
new ConcurrentHashMap<Host,DefaultWebXmlCacheEntry>();
//当容器生命周期变化时,激发
public void lifecycleEvent(LifecycleEvent event) {

// Identify the context we are associated with
try {
//获取Context
context = (Context) event.getLifecycle();
}

if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {
//开始配置
configureStart();
} else if (event.getType().equals(Lifecycle.BEFORE_START_EVENT)) {
beforeStart();
} else if (event.getType().equals(Lifecycle.AFTER_START_EVENT)) {
//context设置docBase
if (originalDocBase != null) {
context.setDocBase(originalDocBase);
}
} else if (event.getType().equals(Lifecycle.CONFIGURE_STOP_EVENT)) {
configureStop();
} else if (event.getType().equals(Lifecycle.AFTER_INIT_EVENT)) {
//初始化
init();
} else if (event.getType().equals(Lifecycle.AFTER_DESTROY_EVENT)) {
destroy();
}
//处理Context的AFTER_INIT_EVENT事件
protected void init() {
// Called from StandardContext.init()
//创建一个解析Context.xml的Digester
Digester contextDigester = createContextDigester();
contextDigester.getParser();
if (log.isDebugEnabled())
log.debug(sm.getString("contextConfig.init"));
context.setConfigured(false);
ok = true;
//解析Context.xml文件
contextConfig(contextDigester);
createWebXmlDigester(context.getXmlNamespaceAware(),
context.getXmlValidation());
}
//获取Context.xml,与Digester关联
protected void contextConfig(Digester digester) {

// Open the default context.xml file, if it exists
if( defaultContextXml==null && context instanceof StandardContext ) {
defaultContextXml = ((StandardContext)context).getDefaultContextXml();
}
// set the default if we don't have any overrides
if( defaultContextXml==null ) getDefaultContextXml();

if (!context.getOverride()) {
File defaultContextFile = new File(defaultContextXml);
if (!defaultContextFile.isAbsolute()) {
defaultContextFile =new File(getBaseDir(), defaultContextXml);
}
if (defaultContextFile.exists()) {
try {
URL defaultContextUrl = defaultContextFile.toURI().toURL();
processContextConfig(digester, defaultContextUrl);
} catch (MalformedURLException e) {
log.error(sm.getString(
"contextConfig.badUrl", defaultContextFile), e);
}
}

File hostContextFile = new File(getHostConfigBase(), Constants.HostContextXml);
if (hostContextFile.exists()) {
try {
URL hostContextUrl = hostContextFile.toURI().toURL();
processContextConfig(digester, hostContextUrl);
} catch (MalformedURLException e) {
log.error(sm.getString(
"contextConfig.badUrl", hostContextFile), e);
}
}
}
if (context.getConfigFile() != null)
processContextConfig(digester, context.getConfigFile());

}
//处理context.xml.
protected void processContextConfig(Digester digester, URL contextXml) {
if (log.isDebugEnabled())
log.debug("Processing context [" + context.getName()
+ "] configuration file [" + contextXml + "]");
InputSource source = null;
InputStream stream = null;
try {
source = new InputSource(contextXml.toString());
URLConnection xmlConn = contextXml.openConnection();
xmlConn.setUseCaches(false);
stream = xmlConn.getInputStream();
}
try {
source.setByteStream(stream);
digester.setClassLoader(this.getClass().getClassLoader());
digester.setUseContextClassLoader(false);
digester.push(context.getParent());
digester.push(context);
XmlErrorHandler errorHandler = new XmlErrorHandler();
digester.setErrorHandler(errorHandler);
digester.parse(source);
if (log.isDebugEnabled()) {
log.debug("Successfully processed context [" + context.getName()
+ "] configuration file [" + contextXml + "]");
}
}
}
}

从上面可以看出Lifecycle.AFTER_INIT_EVENT触发init方法,init方法,首先创建一个
解析Context.xml文件的Digester,然后待在Context.xml文件,由Digester去解析处理;
下面来看一下Lifecycle.BEFORE_START_EVENT触发的方法beforeStart:
//Process a "before start" event for this Context.
protected synchronized void beforeStart() {
try {
//调整docBase.
fixDocBase();
}
//调整antiLockingDocBase
antiLocking();
}
//调整docBase.
protected void fixDocBase()
throws IOException {
//获取StandardHost
Host host = (Host) context.getParent();
String appBase = host.getAppBase();
File canonicalAppBase = new File(appBase);
if (canonicalAppBase.isAbsolute()) {
canonicalAppBase = canonicalAppBase.getCanonicalFile();
} else {
canonicalAppBase =
new File(getBaseDir(), appBase)
.getCanonicalFile();
}
String docBase = context.getDocBase();
if (docBase == null) {
// Trying to guess the docBase according to the path
String path = context.getPath();
if (path == null) {
return;
}
ContextName cn = new ContextName(path, context.getWebappVersion());
docBase = cn.getBaseName();
}
File file = new File(docBase);
if (!file.isAbsolute()) {
docBase = (new File(canonicalAppBase, docBase)).getPath();
} else {
docBase = file.getCanonicalPath();
}
file = new File(docBase);
String origDocBase = docBase;
ContextName cn = new ContextName(context.getPath(),
context.getWebappVersion());
String pathName = cn.getBaseName();
boolean unpackWARs = true;
if (host instanceof StandardHost) {
unpackWARs = ((StandardHost) host).isUnpackWARs();
if (unpackWARs && context instanceof StandardContext) {
unpackWARs = ((StandardContext) context).getUnpackWAR();
}
}
if (docBase.toLowerCase(Locale.ENGLISH).endsWith(".war") && !file.isDirectory()) {
URL war = UriUtil.buildJarUrl(new File(docBase));
if (unpackWARs) {
docBase = ExpandWar.expand(host, war, pathName);
file = new File(docBase);
docBase = file.getCanonicalPath();
if (context instanceof StandardContext) {
//设置StandardContext的docBase
((StandardContext) context).setOriginalDocBase(origDocBase);
}
} else {
ExpandWar.validate(host, war, pathName);
}
} else {
File docDir = new File(docBase);
if (!docDir.exists()) {
File warFile = new File(docBase + ".war");
if (warFile.exists()) {
URL war = UriUtil.buildJarUrl(warFile);
if (unpackWARs) {
docBase = ExpandWar.expand(host, war, pathName);
file = new File(docBase);
docBase = file.getCanonicalPath();
} else {
docBase = warFile.getCanonicalPath();
ExpandWar.validate(host, war, pathName);
}
}
if (context instanceof StandardContext) {
((StandardContext) context).setOriginalDocBase(origDocBase);
}
}
}
context.setDocBase(docBase);

}
//调整antiLockingDocBase
protected void antiLocking() {

if ((context instanceof StandardContext)
&& ((StandardContext) context).getAntiResourceLocking()) {

Host host = (Host) context.getParent();
String appBase = host.getAppBase();
String docBase = context.getDocBase();
originalDocBase = docBase;
File docBaseFile = new File(docBase);
if (!docBaseFile.isAbsolute()) {
File file = new File(appBase);
if (!file.isAbsolute()) {
file = new File(getBaseDir(), appBase);
}
docBaseFile = new File(file, docBase);
}
String path = context.getPath();
ContextName cn = new ContextName(path, context.getWebappVersion());
docBase = cn.getBaseName();
if (originalDocBase.toLowerCase(Locale.ENGLISH).endsWith(".war")) {
antiLockingDocBase = new File(
System.getProperty("java.io.tmpdir"),
deploymentCount++ + "-" + docBase + ".war");
} else {
antiLockingDocBase = new File(
System.getProperty("java.io.tmpdir"),
deploymentCount++ + "-" + docBase);
}
antiLockingDocBase = antiLockingDocBase.getAbsoluteFile();

if (log.isDebugEnabled())
log.debug("Anti locking context[" + context.getName()
+ "] setting docBase to " +
antiLockingDocBase.getPath());

// Cleanup just in case an old deployment is lying around
ExpandWar.delete(antiLockingDocBase);
if (ExpandWar.copy(docBaseFile, antiLockingDocBase)) {
context.setDocBase(antiLockingDocBase.getPath());
}
}
}

从beforeStart方法,我们可以看出每个从ContextConfig,关联一个StandardContext,
而每个StandardContext都有一个父容器StandardHost。
下面来看Lifecycle.CONFIGURE_START_EVENT事件的触发方法configureStart
//处理Context的CONFIGURE_START_EVENT事件
    protected synchronized void configureStart() {
// Called from StandardContext.start()
if (log.isDebugEnabled())
log.debug(sm.getString("contextConfig.start"));
//扫描Web.xml文件,应用到web
webConfig();
if (!context.getIgnoreAnnotations()) {
//处理Listener,Filter,Servet的class,field,method,
//EJB,JSR 250类注解问题,@Resource等注解
applicationAnnotationsConfig();
}
if (ok) {
//配置安全角色信息
validateSecurityRoles();
}
// Configure an authenticator if we need one
if (ok)
authenticatorConfig();
// Dump the contents of this pipeline if requested
if ((log.isDebugEnabled()) && (context instanceof ContainerBase)) {
log.debug("Pipeline Configuration:");
Pipeline pipeline = ((ContainerBase) context).getPipeline();
Valve valves[] = null;
if (pipeline != null)
valves = pipeline.getValves();
if (valves != null) {
for (int i = 0; i < valves.length; i++) {
log.debug(" " + valves[i].getInfo());
}
}
log.debug("======================");
}
// Make our application available if no problems were encountered
if (ok)
context.setConfigured(true);
else {
log.error(sm.getString("contextConfig.unavailable"));
context.setConfigured(false);
}

}
//解析WEB.XML文件,如果存在global web.xml,则以WEB——INF/WEB.XML为准,及当前WEB
    protected void webConfig() {
Set<WebXml> defaults = new HashSet<WebXml>();
//从Host获取默认WebXML,通过Digester解析,添加到defaults
defaults.add(getDefaultWebXmlFragment());
WebXml webXml = createWebXml();
//解析全局Web.xml
// Parse context level web.xml
InputSource contextWebXml = getContextWebXmlSource();
parseWebXml(contextWebXml, webXml, false);

ServletContext sContext = context.getServletContext();

// Ordering is important here

// Step 1. Identify all the JARs packaged with the application
// If the JARs have a web-fragment.xml it will be parsed at this
// point.
Map<String,WebXml> fragments = processJarsForWebFragments(webXml);

// Step 2. Order the fragments.
Set<WebXml> orderedFragments = null;
orderedFragments =
WebXml.orderWebFragments(webXml, fragments, sContext);

// Step 3. Look for ServletContainerInitializer implementations
if (ok) {
processServletContainerInitializers();
}

if (!webXml.isMetadataComplete() || typeInitializerMap.size() > 0) {
// Step 4. Process /WEB-INF/classes for annotations
if (ok) {
// Hack required by Eclipse's "serve modules without
// publishing" feature since this backs WEB-INF/classes by
// multiple locations rather than one.
NamingEnumeration<Binding> listBindings = null;
try {
try {
listBindings = context.getResources().listBindings(
"/WEB-INF/classes");
}
while (listBindings != null &&
listBindings.hasMoreElements()) {
Binding binding = listBindings.nextElement();
if (binding.getObject() instanceof FileDirContext) {
File webInfClassDir = new File(
((FileDirContext) binding.getObject()).getDocBase());
processAnnotationsFile(webInfClassDir, webXml,
webXml.isMetadataComplete());
} else {
String resource =
"/WEB-INF/classes/" + binding.getName();
try {
URL url = sContext.getResource(resource);
processAnnotationsUrl(url, webXml,
webXml.isMetadataComplete());
}
}
}
}
}

// Step 5. Process JARs for annotations - only need to process
// those fragments we are going to use
if (ok) {
processAnnotations(
orderedFragments, webXml.isMetadataComplete());
}

// Cache, if used, is no longer required so clear it
javaClassCache.clear();
}

if (!webXml.isMetadataComplete()) {
// Step 6. Merge web-fragment.xml files into the main web.xml
// file.
if (ok) {
ok = webXml.merge(orderedFragments);
}

// Step 7. Apply global defaults
// Have to merge defaults before JSP conversion since defaults
// provide JSP servlet definition.
webXml.merge(defaults);

// Step 8. Convert explicitly mentioned jsps to servlets
if (ok) {
convertJsps(webXml);
}

// Step 9. Apply merged web.xml to Context
if (ok) {
webXml.configureContext(context);
}
} else {
webXml.merge(defaults);
convertJsps(webXml);
webXml.configureContext(context);
}

// Step 9a. Make the merged web.xml available to other
// components, specifically Jasper, to save those components
// from having to re-generate it.
// TODO Use a ServletContainerInitializer for Jasper
String mergedWebXml = webXml.toXml();
sContext.setAttribute(
org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML,
mergedWebXml);
if (context.getLogEffectiveWebXml()) {
log.info("web.xml:\n" + mergedWebXml);
}

// Always need to look for static resources
// Step 10. Look for static resources packaged in JARs
if (ok) {
// Spec does not define an order.
// Use ordered JARs followed by remaining JARs
Set<WebXml> resourceJars = new LinkedHashSet<WebXml>();
for (WebXml fragment : orderedFragments) {
resourceJars.add(fragment);
}
for (WebXml fragment : fragments.values()) {
if (!resourceJars.contains(fragment)) {
resourceJars.add(fragment);
}
}
processResourceJARs(resourceJars);
// See also StandardContext.resourcesStart() for
// WEB-INF/classes/META-INF/resources configuration
}

// Step 11. Apply the ServletContainerInitializer config to the
// context
if (ok) {
for (Map.Entry<ServletContainerInitializer,
Set<Class<?>>> entry :
initializerClassMap.entrySet()) {
if (entry.getValue().isEmpty()) {
context.addServletContainerInitializer(
entry.getKey(), null);
} else {
context.addServletContainerInitializer(
entry.getKey(), entry.getValue());
}
}
}
}

从上面可看出,webConfig主要是处理web.xml的解析,与全局web.xml(Context)融合的问题
下面看一下cofigStart方法中注解的处理applicationAnnotationsConfig:
// Process the application classes annotations, if it exists.
protected void applicationAnnotationsConfig() {
long t1=System.currentTimeMillis();
WebAnnotationSet.loadApplicationAnnotations(context);
long t2=System.currentTimeMillis();
if (context instanceof StandardContext) {
((StandardContext) context).setStartupTime(t2-t1+
((StandardContext) context).getStartupTime());
}
}

查看WebAnnotationSet的loadApplicationAnnotations函数:
//处理Listener,Filter,Servet的class,field,method,的注解
 public static void loadApplicationAnnotations(Context context) {
loadApplicationListenerAnnotations(context);
loadApplicationFilterAnnotations(context);
loadApplicationServletAnnotations(context);
}
//处理Listener的注解
protected static void loadApplicationListenerAnnotations(Context context) {
Class<?> classClass = null;
//从Context获取applicationListeners
String[] applicationListeners =
context.findApplicationListeners();
for (int i = 0; i < applicationListeners.length; i++) {
classClass = Introspection.loadClass(context,
applicationListeners[i]);
if (classClass == null) {
continue;
}
//处理Listener的class,field,method,的注解
loadClassAnnotation(context, classClass);
loadFieldsAnnotation(context, classClass);
loadMethodsAnnotation(context, classClass);
}
}
//处理Filter的注解
protected static void loadApplicationFilterAnnotations(Context context) {
Class<?> classClass = null;
FilterDef[] filterDefs = context.findFilterDefs();
for (int i = 0; i < filterDefs.length; i++) {
classClass = Introspection.loadClass(context,
(filterDefs[i]).getFilterClass());
if (classClass == null) {
continue;
}
//处理Filter的class,field,method,的注解
loadClassAnnotation(context, classClass);
loadFieldsAnnotation(context, classClass);
loadMethodsAnnotation(context, classClass);
}
}
//处理Server的注解
protected static void loadApplicationServletAnnotations(Context context) {

Wrapper wrapper = null;
Class<?> classClass = null;
Container[] children = context.findChildren();
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof Wrapper) {

wrapper = (Wrapper) children[i];
if (wrapper.getServletClass() == null) {
continue;
}
classClass = Introspection.loadClass(context,
wrapper.getServletClass());
if (classClass == null) {
continue;
}
//处理Servet的class,field,method,的注解
loadClassAnnotation(context, classClass);
loadFieldsAnnotation(context, classClass);
loadMethodsAnnotation(context, classClass);
/* Process RunAs annotation which can be only on servlets.
* Ref JSR 250, equivalent to the run-as element in
* the deployment descriptor
*/
RunAs annotation = classClass.getAnnotation(RunAs.class);
if (annotation != null) {
wrapper.setRunAs(annotation.value());
}
}
}

}
//处理Listener的class,field,method,的注解
protected static void loadClassAnnotation(Context context,
Class<?> classClass) {
/* Process Resource annotation.
* Ref JSR 250
*/
{
Resource annotation = classClass.getAnnotation(Resource.class);
if (annotation != null) {
addResource(context, annotation);
}
}
/* Process Resources annotation.
* Ref JSR 250
*/
{
//@Resource
Resources annotation = classClass.getAnnotation(Resources.class);
if (annotation != null && annotation.value() != null) {
for (Resource resource : annotation.value()) {
addResource(context, resource);
}
}
}
/* Process EJB annotation.
* Ref JSR 224, equivalent to the ejb-ref or ejb-local-ref
* element in the deployment descriptor.
{
//@EJB
EJB annotation = classClass.getAnnotation(EJB.class);
if (annotation != null) {

if ((annotation.mappedName().length() == 0)
|| annotation.mappedName().equals("Local")) {

ContextLocalEjb ejb = new ContextLocalEjb();

ejb.setName(annotation.name());
ejb.setType(annotation.beanInterface().getCanonicalName());
ejb.setDescription(annotation.description());

ejb.setHome(annotation.beanName());

context.getNamingResources().addLocalEjb(ejb);

} else if (annotation.mappedName().equals("Remote")) {

ContextEjb ejb = new ContextEjb();

ejb.setName(annotation.name());
ejb.setType(annotation.beanInterface().getCanonicalName());
ejb.setDescription(annotation.description());

ejb.setHome(annotation.beanName());

context.getNamingResources().addEjb(ejb);

}
}
}
*/
/* Process WebServiceRef annotation.
* Ref JSR 224, equivalent to the service-ref element in
* the deployment descriptor.
* The service-ref registration is not implemented
{
//@WebServiceRef
WebServiceRef annotation = classClass
.getAnnotation(WebServiceRef.class);
if (annotation != null) {
ContextService service = new ContextService();

service.setName(annotation.name());
service.setWsdlfile(annotation.wsdlLocation());

service.setType(annotation.type().getCanonicalName());

if (annotation.value() == null)
service.setServiceinterface(annotation.type()
.getCanonicalName());

if (annotation.type().getCanonicalName().equals("Service"))
service.setServiceinterface(annotation.type()
.getCanonicalName());

if (annotation.value().getCanonicalName().equals("Endpoint"))
service.setServiceendpoint(annotation.type()
.getCanonicalName());

service.setPortlink(annotation.type().getCanonicalName());

context.getNamingResources().addService(service);
}
}
*/
/* Process DeclareRoles annotation.
* Ref JSR 250, equivalent to the security-role element in
* the deployment descriptor
*/
{
//@DeclareRoles
DeclareRoles annotation = classClass
.getAnnotation(DeclareRoles.class);
if (annotation != null && annotation.value() != null) {
for (String role : annotation.value()) {
context.addSecurityRole(role);
}
}
}
}
//处理field注解
protected static void loadFieldsAnnotation(Context context,
Class<?> classClass) {
// Initialize the annotations
Field[] fields = Introspection.getDeclaredFields(classClass);
if (fields != null && fields.length > 0) {
for (Field field : fields) {
//@Resource
Resource annotation = field.getAnnotation(Resource.class);
if (annotation != null) {
String defaultName = classClass.getName() + SEPARATOR + field.getName();
Class<?> defaultType = field.getType();
addResource(context, annotation, defaultName, defaultType);
}
}
}
}
//处理method注解
protected static void loadMethodsAnnotation(Context context,
Class<?> classClass) {
// Initialize the annotations
Method[] methods = Introspection.getDeclaredMethods(classClass);
if (methods != null && methods.length > 0) {
for (Method method : methods) {
//@Resource
Resource annotation = method.getAnnotation(Resource.class);
if (annotation != null) {
if (!Introspection.isValidSetter(method)) {
throw new IllegalArgumentException(sm.getString(
"webAnnotationSet.invalidInjection"));
}
String defaultName = classClass.getName() + SEPARATOR +
Introspection.getPropertyName(method);

Class<?> defaultType =
(method.getParameterTypes()[0]);
addResource(context, annotation, defaultName, defaultType);
}
}
}
}

从分析注解的配置可以看出,实际上就是先从Context获取Lisenters,Filters和Servlets,
然后分别处理Lisenters,Filters和Servlets的Class,Field和Method的注解。
下面来看Lifecycle.AFTER_START_EVENT事件的触发方法configureStart
//context设置docBase
 if (originalDocBase != null) {
context.setDocBase(originalDocBase);
}

总结:
[color=blue]从以上分析每个Host,关联一个ContextConfig和StandardContext,而ContextConfig关联于StandardContext;ContextConfig其实是一个LifecycleListener可以监听StandardContext容器的声明周期变化;当处于AFTER_INIT_EVEN状态时,加载Context.xml文件,通过Digester解析;当处于BEFORE_START_EVENT状态时,docbase;当处于CONFIGURE_START_EVENT状态时,加载Web.xml配置(欢迎页面,参数,listeners,filters,Servlet,filters-Maping,Servlet-Maping,SessionConfig,errorPage等),然后处理listeners,filters,Servlet的注解等;当处于AFTER_START_EVENT状态时,设置context的docBase,自此完成web应用的context.xml,web.xml的初始化工作。[/color]

附:
//Web.xml配置文件类
/**
* Representation of common elements of web.xml and web-fragment.xml. Provides
* a repository for parsed data before the elements are merged.
* Validation is spread between multiple classes:
* The digester checks for structural correctness (eg single login-config)
* This class checks for invalid duplicates (eg filter/servlet names)
* StandardContext will check validity of values (eg URL formats etc)
*/
public class WebXml {
// context-param
// TODO: description (multiple with language) is ignored
private Map<String,String> contextParams = new HashMap<String,String>();
public void addContextParam(String param, String value) {
contextParams.put(param, value);
}
public Map<String,String> getContextParams() { return contextParams; }

// filter
// TODO: Should support multiple description elements with language
// TODO: Should support multiple display-name elements with language
// TODO: Should support multiple icon elements
// TODO: Description for init-param is ignored
private Map<String,FilterDef> filters =
new LinkedHashMap<String,FilterDef>();
//添加Filter
public void addFilter(FilterDef filter) {
if (filters.containsKey(filter.getFilterName())) {
// Filter names must be unique within a web(-fragment).xml
throw new IllegalArgumentException(
sm.getString("webXml.duplicateFilter",
filter.getFilterName()));
}
filters.put(filter.getFilterName(), filter);
}
public Map<String,FilterDef> getFilters() { return filters; }

// filter-mapping
private Set<FilterMap> filterMaps = new LinkedHashSet<FilterMap>();
private Set<String> filterMappingNames = new HashSet<String>();
//添加FilterMaping
public void addFilterMapping(FilterMap filterMap) {
filterMaps.add(filterMap);
filterMappingNames.add(filterMap.getFilterName());
}
public Set<FilterMap> getFilterMappings() { return filterMaps; }

// listener
// TODO: description (multiple with language) is ignored
// TODO: display-name (multiple with language) is ignored
// TODO: icon (multiple) is ignored
private Set<String> listeners = new LinkedHashSet<String>();
//添加Listeners
public void addListener(String className) {
listeners.add(className);
}
public Set<String> getListeners() { return listeners; }

// servlet
// TODO: description (multiple with language) is ignored
// TODO: display-name (multiple with language) is ignored
// TODO: icon (multiple) is ignored
// TODO: init-param/description (multiple with language) is ignored
// TODO: security-role-ref/description (multiple with language) is ignored
private Map<String,ServletDef> servlets = new HashMap<String,ServletDef>();
//添加Servlet
public void addServlet(ServletDef servletDef) {
servlets.put(servletDef.getServletName(), servletDef);
if (overridable) {
servletDef.setOverridable(overridable);
}
}
public Map<String,ServletDef> getServlets() { return servlets; }

// servlet-mapping
private Map<String,String> servletMappings = new HashMap<String,String>();
private Set<String> servletMappingNames = new HashSet<String>();
//添加Servlet-mapping
public void addServletMapping(String urlPattern, String servletName) {
String oldServletName = servletMappings.put(urlPattern, servletName);
if (oldServletName != null) {
// Duplicate mapping. As per clarification from the Servlet EG,
// deployment should fail.
throw new IllegalArgumentException(sm.getString(
"webXml.duplicateServletMapping", oldServletName,
servletName, urlPattern));
}
servletMappingNames.add(servletName);
}
public Map<String,String> getServletMappings() { return servletMappings; }

// session-config
// Digester will check there is only one of these
private SessionConfig sessionConfig = new SessionConfig();
public void setSessionConfig(SessionConfig sessionConfig) {
this.sessionConfig = sessionConfig;
}
public SessionConfig getSessionConfig() { return sessionConfig; }

// mime-mapping
private Map<String,String> mimeMappings = new HashMap<String,String>();
public void addMimeMapping(String extension, String mimeType) {
mimeMappings.put(extension, mimeType);
}
public Map<String,String> getMimeMappings() { return mimeMappings; }
// welcome-file-list
private Set<String> welcomeFiles = new LinkedHashSet<String>();
public void addWelcomeFile(String welcomeFile) {
if (replaceWelcomeFiles) {
welcomeFiles.clear();
replaceWelcomeFiles = false;
}
welcomeFiles.add(welcomeFile);
}
public Set<String> getWelcomeFiles() { return welcomeFiles; }

// error-page
private Map<String,ErrorPage> errorPages = new HashMap<String,ErrorPage>();
public void addErrorPage(ErrorPage errorPage) {
errorPages.put(errorPage.getName(), errorPage);
}
public Map<String,ErrorPage> getErrorPages() { return errorPages; }

// Digester will check there is only one jsp-config
// jsp-config/taglib or taglib (2.3 and earlier)
private Map<String,String> taglibs = new HashMap<String,String>();
public void addTaglib(String uri, String location) {
if (taglibs.containsKey(uri)) {
// Taglib URIs must be unique within a web(-fragment).xml
throw new IllegalArgumentException(
sm.getString("webXml.duplicateTaglibUri", uri));
}
taglibs.put(uri, location);
}
public Map<String,String> getTaglibs() { return taglibs; }

// jsp-config/jsp-property-group
private Set<JspPropertyGroup> jspPropertyGroups =
new LinkedHashSet<JspPropertyGroup>();
public void addJspPropertyGroup(JspPropertyGroup propertyGroup) {
jspPropertyGroups.add(propertyGroup);
}
public Set<JspPropertyGroup> getJspPropertyGroups() {
return jspPropertyGroups;
}

// security-constraint
// TODO: Should support multiple display-name elements with language
// TODO: Should support multiple description elements with language
private Set<SecurityConstraint> securityConstraints =
new HashSet<SecurityConstraint>();
public void addSecurityConstraint(SecurityConstraint securityConstraint) {
securityConstraints.add(securityConstraint);
}
public Set<SecurityConstraint> getSecurityConstraints() {
return securityConstraints;
}

// login-config
// Digester will check there is only one of these
private LoginConfig loginConfig = null;
public void setLoginConfig(LoginConfig loginConfig) {
this.loginConfig = loginConfig;
}
public LoginConfig getLoginConfig() { return loginConfig; }

// security-role
// TODO: description (multiple with language) is ignored
private Set<String> securityRoles = new HashSet<String>();
public void addSecurityRole(String securityRole) {
securityRoles.add(securityRole);
}
public Set<String> getSecurityRoles() { return securityRoles; }


// resource-ref
// TODO: Should support multiple description elements with language
private Map<String,ContextResource> resourceRefs =
new HashMap<String,ContextResource>();
public void addResourceRef(ContextResource resourceRef) {
if (resourceRefs.containsKey(resourceRef.getName())) {
// resource-ref names must be unique within a web(-fragment).xml
throw new IllegalArgumentException(
sm.getString("webXml.duplicateResourceRef",
resourceRef.getName()));
}
resourceRefs.put(resourceRef.getName(), resourceRef);
}
public Map<String,ContextResource> getResourceRefs() {
return resourceRefs;
}

// resource-env-ref
// TODO: Should support multiple description elements with language
private Map<String,ContextResourceEnvRef> resourceEnvRefs =
new HashMap<String,ContextResourceEnvRef>();
public void addResourceEnvRef(ContextResourceEnvRef resourceEnvRef) {
if (resourceEnvRefs.containsKey(resourceEnvRef.getName())) {
// resource-env-ref names must be unique within a web(-fragment).xml
throw new IllegalArgumentException(
sm.getString("webXml.duplicateResourceEnvRef",
resourceEnvRef.getName()));
}
resourceEnvRefs.put(resourceEnvRef.getName(), resourceEnvRef);
}
public Map<String,ContextResourceEnvRef> getResourceEnvRefs() {
return resourceEnvRefs;
}
}

//处理XML的Digester
public class Digester extends DefaultHandler2 {
/**
* The parameters stack being utilized by CallMethodRule and
* CallParamRule rules.
*/
protected ArrayStack<Object> params = new ArrayStack<Object>();
/**
* The stack of body text string buffers for surrounding elements.
*/
protected ArrayStack<StringBuilder> bodyTexts =
new ArrayStack<StringBuilder>();

/**
* Construct a new Digester with default properties.
*/
public Digester() {
super();
}
/**
* Construct a new Digester, allowing a SAXParser to be passed in. This
* allows Digester to be used in environments which are unfriendly to
* JAXP1.1 (such as WebLogic 6.0). Thanks for the request to change go to
* James House (james@interobjective.com). This may help in places where
* you are able to load JAXP 1.1 classes yourself.
*/
public Digester(SAXParser parser) {
super();
this.parser = parser;
}
/**
* Construct a new Digester, allowing an XMLReader to be passed in. This
* allows Digester to be used in environments which are unfriendly to
* JAXP1.1 (such as WebLogic 6.0). Note that if you use this option you
* have to configure namespace and validation support yourself, as these
* properties only affect the SAXParser and empty constructor.
*/
public Digester(XMLReader reader) {
super();
this.reader = reader;
}
/**
* Push a new object onto the top of the object stack.
*
* @param object The new object
*/
public void push(Object object) {

if (stack.size() == 0) {
root = object;
}
stack.push(object);

}

/**
* Pushes the given object onto the stack with the given name.
* If no stack already exists with the given name then one will be created.
*
* @param stackName the name of the stack onto which the object should be pushed
* @param value the Object to be pushed onto the named stack.
*
* @since 1.6
*/
public void push(String stackName, Object value) {
ArrayStack<Object> namedStack = stacksByName.get(stackName);
if (namedStack == null) {
namedStack = new ArrayStack<Object>();
stacksByName.put(stackName, namedStack);
}
namedStack.push(value);
}
}
------------------------ catalina.2025-06-26.log ------------------------ 26-Jun-2025 11:48:04.128 信息 [Thread-4] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"] 26-Jun-2025 11:48:04.184 信息 [Thread-4] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina] 26-Jun-2025 11:48:04.246 信息 [Thread-4] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler ["http-nio-8080"] 26-Jun-2025 11:48:04.251 信息 [Thread-4] org.apache.coyote.AbstractProtocol.destroy 正在摧毁协议处理器 ["http-nio-8080"] 26-Jun-2025 11:48:04.268 警告 [Thread-4] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [KuCun2] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。 26-Jun-2025 11:48:04.276 警告 [Thread-4] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[KuCun2]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[ java.base@11/java.lang.Object.wait(Native Method) java.base@11/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155) com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:91) java.base@11/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) java.base@11/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) java.base@11/java.lang.Thread.run(Thread.java:834)] 26-Jun-2025 11:48:55.666 警告 [main] org.apache.catalina.core.AprLifecycleListener.init 基于APR的本地库加载失败.错误报告为[D:\apache-tomcat-9.0.37\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform] java.lang.UnsatisfiedLinkError: D:\apache-tomcat-9.0.37\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method) at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430) at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487) at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684) at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617) at java.base/java.lang.Runtime.load0(Runtime.java:767) at java.base/java.lang.System.load(System.java:1831) at org.apache.tomcat.jni.Library.<init>(Library.java:42) at org.apache.tomcat.jni.Library.initialize(Library.java:206) at org.apache.catalina.core.AprLifecycleListener.init(AprLifecycleListener.java:198) at org.apache.catalina.core.AprLifecycleListener.isAprAvailable(AprLifecycleListener.java:107) at org.apache.catalina.connector.Connector.<init>(Connector.java:83) at org.apache.catalina.startup.ConnectorCreateRule.begin(ConnectorCreateRule.java:67) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1259) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:510) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1377) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2708) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824) at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1216) at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1517) at org.apache.catalina.startup.Catalina.parseServerXml(Catalina.java:584) at org.apache.catalina.startup.Catalina.load(Catalina.java:675) at org.apache.catalina.startup.Catalina.load(Catalina.java:712) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472) 26-Jun-2025 11:48:55.837 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.37 26-Jun-2025 11:48:55.839 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jun 30 2020 20:09:49 UTC 26-Jun-2025 11:48:55.841 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号(: 9.0.37.0 26-Jun-2025 11:48:55.844 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 7 26-Jun-2025 11:48:55.846 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 6.1 26-Jun-2025 11:48:55.847 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 26-Jun-2025 11:48:55.850 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: D:\jdk11_jb51 26-Jun-2025 11:48:55.852 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 11+28 26-Jun-2025 11:48:55.854 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 26-Jun-2025 11:48:55.856 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\apache-tomcat-9.0.37 26-Jun-2025 11:48:55.858 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\apache-tomcat-9.0.37 26-Jun-2025 11:48:55.861 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:--add-opens=java.base/java.lang=ALL-UNNAMED 26-Jun-2025 11:48:55.864 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:--add-opens=java.base/java.io=ALL-UNNAMED 26-Jun-2025 11:48:55.867 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 26-Jun-2025 11:48:55.870 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.config.file=D:\apache-tomcat-9.0.37\conf\logging.properties 26-Jun-2025 11:48:55.872 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 26-Jun-2025 11:48:55.874 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djdk.tls.ephemeralDHKeySize=2048 26-Jun-2025 11:48:55.876 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.protocol.handler.pkgs=org.apache.catalina.webresources 26-Jun-2025 11:48:55.879 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dignore.endorsed.dirs= 26-Jun-2025 11:48:55.881 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.base=D:\apache-tomcat-9.0.37 26-Jun-2025 11:48:55.883 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.home=D:\apache-tomcat-9.0.37 26-Jun-2025 11:48:55.885 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.io.tmpdir=D:\apache-tomcat-9.0.37\temp 26-Jun-2025 11:48:56.667 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 26-Jun-2025 11:48:56.844 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[1446]毫秒内初始化 26-Jun-2025 11:48:56.971 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 26-Jun-2025 11:48:56.973 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.37] 26-Jun-2025 11:48:57.006 信息 [main] org.apache.catalina.startup.HostConfig.deployWAR 正在部署web应用程序存档文件[D:\apache-tomcat-9.0.37\webapps\KuCun2.war] 26-Jun-2025 11:49:01.871 信息 [main] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 26-Jun-2025 11:49:18.187 信息 [main] org.apache.catalina.startup.HostConfig.deployWAR web应用程序存档文件[D:\apache-tomcat-9.0.37\webapps\KuCun2.war]的部署已在[21,180]ms内完成 26-Jun-2025 11:49:18.190 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\docs] 26-Jun-2025 11:49:18.245 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\docs]的部署已在[56]毫秒内完成 26-Jun-2025 11:49:18.247 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\examples] 26-Jun-2025 11:49:18.654 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\examples]的部署已在[407]毫秒内完成 26-Jun-2025 11:49:18.658 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\host-manager] 26-Jun-2025 11:49:18.703 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\host-manager]的部署已在[45]毫秒内完成 26-Jun-2025 11:49:18.709 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\manager] 26-Jun-2025 11:49:18.758 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\manager]的部署已在[50]毫秒内完成 26-Jun-2025 11:49:18.764 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\ROOT] 26-Jun-2025 11:49:18.810 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\ROOT]的部署已在[47]毫秒内完成 26-Jun-2025 11:49:18.820 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 26-Jun-2025 11:49:18.845 信息 [main] org.apache.catalina.startup.Catalina.start [22000]毫秒后服务器启动 26-Jun-2025 11:49:56.871 信息 [Thread-4] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"] 26-Jun-2025 11:49:56.912 信息 [Thread-4] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina] 26-Jun-2025 11:49:57.187 警告 [Thread-4] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[KuCun2]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[ java.base@11/java.lang.Object.wait(Native Method) java.base@11/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155) com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:91) java.base@11/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) java.base@11/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) java.base@11/java.lang.Thread.run(Thread.java:834)] 26-Jun-2025 11:49:57.214 信息 [Thread-4] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler ["http-nio-8080"] 26-Jun-2025 11:49:57.223 信息 [Thread-4] org.apache.coyote.AbstractProtocol.destroy 正在摧毁协议处理器 ["http-nio-8080"] ------------------------ host-manager.2025-06-26.log ------------------------ ------------------------ localhost.2025-06-26.log ------------------------ 26-Jun-2025 11:48:04.218 信息 [Thread-4] org.apache.catalina.core.ApplicationContext.log SessionListener: contextDestroyed() 26-Jun-2025 11:48:04.218 信息 [Thread-4] org.apache.catalina.core.ApplicationContext.log ContextListener: contextDestroyed() 26-Jun-2025 11:49:02.103 信息 [main] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath 26-Jun-2025 11:49:07.916 信息 [main] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext 26-Jun-2025 11:49:18.643 信息 [main] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() 26-Jun-2025 11:49:18.644 信息 [main] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized() 26-Jun-2025 11:49:18.646 信息 [main] org.apache.catalina.core.ApplicationContext.log ContextListener: attributeAdded('StockTicker', 'async.Stockticker@13bf8a36') 26-Jun-2025 11:49:56.945 信息 [Thread-4] org.apache.catalina.core.ApplicationContext.log SessionListener: contextDestroyed() 26-Jun-2025 11:49:56.945 信息 [Thread-4] org.apache.catalina.core.ApplicationContext.log ContextListener: contextDestroyed() 26-Jun-2025 11:49:56.970 信息 [Thread-4] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext ------------------------ localhost_access_log.2025-06-26.txt ------------------------ ------------------------ manager.2025-06-26.log ------------------------
06-27
F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\bin\catalina.bat run [2025-06-17 12:51:53,585] Artifact Shopping-Web:war exploded: Waiting for server connection to start artifact deployment... Using CATALINA_BASE: "C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b" Using CATALINA_HOME: "F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42" Using CATALINA_TMPDIR: "F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\temp" Using JRE_HOME: "F:\jdk-17.0.15_windows-x64_bin\jdk-17.0.15" Using CLASSPATH: "F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\bin\bootstrap.jar;F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/10.1.42 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jun 5 2025 22:35:46 UTC 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 10.1.42.0 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 11 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: F:\jdk-17.0.15_windows-x64_bin\jdk-17.0.15 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 17.0.15+9-LTS-241 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b 17-Jun-2025 12:51:54.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b\conf\logging.properties 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote= 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.port=1099 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.ssl=false 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.password.file=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b\jmxremote.password 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.access.file=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b\jmxremote.access 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.rmi.server.hostname=127.0.0.1 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dsun.io.useCanonCaches=false 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang.reflect=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.io=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=C:\Users\sunny\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\82d452a7-88a2-4557-a7c9-f7ed9538c91b 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42 17-Jun-2025 12:51:54.434 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\temp 17-Jun-2025 12:51:54.443 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.6]加载了基于APR的Apache Tomcat本机库[2.0.9]。 17-Jun-2025 12:51:54.443 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.5.0 8 Apr 2025] 17-Jun-2025 12:51:54.551 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 17-Jun-2025 12:51:54.572 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[311]毫秒内初始化 17-Jun-2025 12:51:54.626 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 17-Jun-2025 12:51:54.626 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/10.1.42] 17-Jun-2025 12:51:54.651 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 17-Jun-2025 12:51:54.701 信息 [main] org.apache.catalina.startup.Catalina.start [126]毫秒后服务器启动 Connected to server [2025-06-17 12:51:54,777] Artifact Shopping-Web:war exploded: Artifact is being deployed, please wait... 17-Jun-2025 12:51:55.805 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanResourcePaths 在资源路径[/WEB-INF/]中找不到TLD文件。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-beans-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-jcl-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/mysql-connector-java-8.0.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-expression-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.824 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-core-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.859 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在JAR[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/jstl-1.2.jar]中找到了TLD文件。 17-Jun-2025 12:51:55.859 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-context-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.867 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/protobuf-java-3.19.4.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.867 详细 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan 在[file:/F:/Shopping-Web/Shopping-Web/target/ShoppingWeb-1.0-SNAPSHOT/WEB-INF/lib/spring-aop-5.3.30.jar]中找不到TLD文件。考虑将JAR添加到CATALINA_BASE/conf/CATALINA.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip属性。 17-Jun-2025 12:51:55.867 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 17-Jun-2025 12:51:55.952 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 17-Jun-2025 12:51:55.952 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/Shopping_Web_war_exploded]启动失败 [2025-06-17 12:51:55,962] Artifact Shopping-Web:war exploded: Error during artifact deployment. See server log for details. 17-Jun-2025 12:52:04.663 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\webapps\manager] 17-Jun-2025 12:52:04.715 详细 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanResourcePaths 在资源路径[/WEB-INF/jsp/]中找不到TLD文件。 17-Jun-2025 12:52:04.717 详细 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanResourcePaths 在资源路径[/WEB-INF/]中找不到TLD文件。 17-Jun-2025 12:52:04.724 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[F:\idea_java\apache-tomcat-10.1.42-windows-x64\apache-tomcat-10.1.42\webapps\manager]的部署已在[61]毫秒内完成
06-19
/* 文件路径: 新建文件夹 (2)/catalina.2025-06-27.log */ 27-Jun-2025 19:32:44.030 警告 [main] org.apache.catalina.core.AprLifecycleListener.init 基于APR的本地库加载失败.错误报告为[D:\apache-tomcat-9.0.37\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform] java.lang.UnsatisfiedLinkError: D:\apache-tomcat-9.0.37\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method) at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430) at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487) at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684) at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617) at java.base/java.lang.Runtime.load0(Runtime.java:767) at java.base/java.lang.System.load(System.java:1831) at org.apache.tomcat.jni.Library.<init>(Library.java:42) at org.apache.tomcat.jni.Library.initialize(Library.java:206) at org.apache.catalina.core.AprLifecycleListener.init(AprLifecycleListener.java:198) at org.apache.catalina.core.AprLifecycleListener.isAprAvailable(AprLifecycleListener.java:107) at org.apache.catalina.connector.Connector.<init>(Connector.java:83) at org.apache.catalina.startup.ConnectorCreateRule.begin(ConnectorCreateRule.java:67) at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1259) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:510) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1377) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2708) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605) at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888) at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824) at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1216) at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1517) at org.apache.catalina.startup.Catalina.parseServerXml(Catalina.java:584) at org.apache.catalina.startup.Catalina.load(Catalina.java:675) at org.apache.catalina.startup.Catalina.load(Catalina.java:712) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472) 27-Jun-2025 19:32:44.355 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.37 27-Jun-2025 19:32:44.358 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jun 30 2020 20:09:49 UTC 27-Jun-2025 19:32:44.361 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号(: 9.0.37.0 27-Jun-2025 19:32:44.364 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 7 27-Jun-2025 19:32:44.367 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 6.1 27-Jun-2025 19:32:44.371 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 27-Jun-2025 19:32:44.374 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: D:\jdk11_jb51 27-Jun-2025 19:32:44.376 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 11+28 27-Jun-2025 19:32:44.380 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 27-Jun-2025 19:32:44.397 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\apache-tomcat-9.0.37 27-Jun-2025 19:32:44.400 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\apache-tomcat-9.0.37 27-Jun-2025 19:32:44.414 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:--add-opens=java.base/java.lang=ALL-UNNAMED 27-Jun-2025 19:32:44.417 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:--add-opens=java.base/java.io=ALL-UNNAMED 27-Jun-2025 19:32:44.419 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 27-Jun-2025 19:32:44.421 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.config.file=D:\apache-tomcat-9.0.37\conf\logging.properties 27-Jun-2025 19:32:44.425 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 27-Jun-2025 19:32:44.427 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djdk.tls.ephemeralDHKeySize=2048 27-Jun-2025 19:32:44.430 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.protocol.handler.pkgs=org.apache.catalina.webresources 27-Jun-2025 19:32:44.432 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dignore.endorsed.dirs= 27-Jun-2025 19:32:44.435 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.base=D:\apache-tomcat-9.0.37 27-Jun-2025 19:32:44.437 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.home=D:\apache-tomcat-9.0.37 27-Jun-2025 19:32:44.440 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.io.tmpdir=D:\apache-tomcat-9.0.37\temp 27-Jun-2025 19:32:45.235 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 27-Jun-2025 19:32:45.461 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["https-jsse-nio-8443"] 27-Jun-2025 19:32:47.054 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[3440]毫秒内初始化 27-Jun-2025 19:32:47.196 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 27-Jun-2025 19:32:47.199 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.37] 27-Jun-2025 19:32:47.268 信息 [main] org.apache.catalina.startup.HostConfig.deployWAR 正在部署web应用程序存档文件[D:\apache-tomcat-9.0.37\webapps\KuCun2.war] 27-Jun-2025 19:32:54.900 信息 [main] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 27-Jun-2025 19:33:13.952 警告 [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 使用[SHA1PRNG]创建会话ID生成的SecureRandom实例花费了[149]毫秒。 27-Jun-2025 19:33:14.004 信息 [main] org.apache.catalina.startup.HostConfig.deployWAR web应用程序存档文件[D:\apache-tomcat-9.0.37\webapps\KuCun2.war]的部署已在[26,736]ms内完成 27-Jun-2025 19:33:14.016 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\docs] 27-Jun-2025 19:33:14.092 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\docs]的部署已在[75]毫秒内完成 27-Jun-2025 19:33:14.112 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\examples] 27-Jun-2025 19:33:15.270 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\examples]的部署已在[1,158]毫秒内完成 27-Jun-2025 19:33:15.309 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\host-manager] 27-Jun-2025 19:33:15.465 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\host-manager]的部署已在[156]毫秒内完成 27-Jun-2025 19:33:15.494 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\manager] 27-Jun-2025 19:33:15.563 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\manager]的部署已在[69]毫秒内完成 27-Jun-2025 19:33:15.594 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-9.0.37\webapps\ROOT] 27-Jun-2025 19:33:15.664 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-9.0.37\webapps\ROOT]的部署已在[69]毫秒内完成 27-Jun-2025 19:33:15.694 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 27-Jun-2025 19:33:15.756 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["https-jsse-nio-8443"] 27-Jun-2025 19:33:15.810 信息 [main] org.apache.catalina.startup.Catalina.start [28752]毫秒后服务器启动 ================================================================================ /* 文件路径: 新建文件夹 (2)/host-manager.2025-06-27.log */ ================================================================================ /* 文件路径: 新建文件夹 (2)/localhost_access_log.2025-06-27.txt */ ================================================================================ /* 文件路径: 新建文件夹 (2)/localhost.2025-06-27.log */ 27-Jun-2025 19:32:55.320 信息 [main] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath 27-Jun-2025 19:33:01.937 信息 [main] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext 27-Jun-2025 19:33:15.260 信息 [main] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() 27-Jun-2025 19:33:15.260 信息 [main] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized() 27-Jun-2025 19:33:15.262 信息 [main] org.apache.catalina.core.ApplicationContext.log ContextListener: attributeAdded('StockTicker', 'async.Stockticker@7a602de2') ================================================================================ /* 文件路径: 新建文件夹 (2)/manager.2025-06-27.log */
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值