Tomcat8.5源码分析-HostConfig

本文详细剖析了Tomcat启动过程中的关键步骤,包括如何通过HostConfig处理生命周期事件、部署应用程序等,并深入探讨了StandardContext的启动流程。

HostConfig

1.  public void lifecycleEvent(LifecycleEvent event) {  
2.    
3.         // Identify the host we are associated with  
4.         try {  
5.             host = (Host) event.getLifecycle();  
6.             if (host instanceof StandardHost) {  
7.                 setCopyXML(((StandardHost) host).isCopyXML());  
8.                 setDeployXML(((StandardHost) host).isDeployXML());  
9.                 setUnpackWARs(((StandardHost) host).isUnpackWARs());  
10.                setContextClass(((StandardHost) host).getContextClass());  
11.            }  
12.        } catch (ClassCastException e) {  
13.            log.error(sm.getString("hostConfig.cce", event.getLifecycle()), e);  
14.            return;  
15.        }  
16.   
17.        // Process the event that has occurred  
18.        if (event.getType().equals(Lifecycle.PERIODIC_EVENT)) {  
19.            check();  
20.        } else if (event.getType().equals(Lifecycle.BEFORE_START_EVENT)) {  
21.            beforeStart();  
22.        } else if (event.getType().equals(Lifecycle.START_EVENT)) {  
23.            start();//StandHost.startInternal() 触发了这个事件  
24.        } else if (event.getType().equals(Lifecycle.STOP_EVENT)) {  
25.            stop();  
26.        }  
27.    }  

首先这个方法会检验Host是否是我们需要的,然后由于我们改变了生命周期的状态,所以调用它的start()方法。我们接着看代码:

1.  public void start() {  
2.      //进行日志的相关处理和jmx的注册  
3.         if (log.isDebugEnabled())  
4.             log.debug(sm.getString("hostConfig.start"));  
5.    
6.         try {  
7.             ObjectName hostON = host.getObjectName();  
8.             oname = new ObjectName  
9.                 (hostON.getDomain() + ":type=Deployer,host=" + host.getName());  
10.            Registry.getRegistry(null, null).registerComponent  
11.                (this, oname, this.getClass().getName());  
12.        } catch (Exception e) {  
13.            log.error(sm.getString("hostConfig.jmx.register", oname), e);  
14.        }  
15.   
16.        if (!host.getAppBaseFile().isDirectory()) {  
17.            log.error(sm.getString("hostConfig.appBase", host.getName(),  
18.                    host.getAppBaseFile().getPath()));  
19.            host.setDeployOnStartup(false);  
20.            host.setAutoDeploy(false);  
21.        }  
22.        /*部署应用*/  
23.        if (host.getDeployOnStartup())  
24.            deployApps();//context描述文件的部署,web目录的部署,WAR包的部署  
25.   
26.    }  

接着我们看deployApps():

1.  protected void deployApps() {  
2.    
3.         File appBase = host.getAppBaseFile();  
4.         File configBase = host.getConfigBaseFile();  
5.         String[] filteredAppPaths = filterAppPaths(appBase.list());  
6.         // Deploy XML descriptors from configBase  
7.         deployDescriptors(configBase, configBase.list());  
8.         // Deploy WARs  
9.         deployWARs(appBase, filteredAppPaths);  
10.        // Deploy expanded folders  
11.        deployDirectories(appBase, filteredAppPaths);  
12.   
13.    }  

我们只看这一个deployDescriptors描述文件的部署:

1.  protected void deployDescriptors(File configBase, String[] files) {  
2.    
3.         if (files == null)  
4.             return;  
5.    
6.         ExecutorService es = host.getStartStopExecutor();  
7.         List<Future<?>> results = new ArrayList<>();  
8.    
9.         for (int i = 0; i < files.length; i++) {/*扫描host配置文件的基础目录*/  
10.            File contextXml = new File(configBase, files[i]);  
11.   
12.            if (files[i].toLowerCase(Locale.ENGLISH).endsWith(".xml")) {/*对于每个配置文件*/  
13.                ContextName cn = new ContextName(files[i], true);  
14.   
15.                if (isServiced(cn.getName()) || deploymentExists(cn.getName()))  
16.                    continue;  
17.   
18.                results.add(  
19.                        es.submit(new DeployDescriptor(this, cn, contextXml)));/*由线程池完成解析部署,调用run()*/  
20.            }  
21.        }  
22.   
23.        for (Future<?> result : results) {  
24.            try {  
25.                result.get();  
26.            } catch (Exception e) {  
27.                log.error(sm.getString(  
28.                        "hostConfig.deployDescriptor.threaded.error"), e);  
29.            }  
30.        }  
31.    }  

接着看它的代码:

2.  private static class DeployDescriptor implements Runnable {  
2.    
3.         private HostConfig config;  
4.         private ContextName cn;  
5.         private File descriptor;  
6.    
7.         public DeployDescriptor(HostConfig config, ContextName cn,  
8.                 File descriptor) {  
9.             this.config = config;  
10.            this.cn = cn;  
11.            this.descriptor= descriptor;  
12.        }  
13.   
14.        @Override  
15.        public void run() {  
16.            config.deployDescriptor(cn, descriptor);/*线程调用方法*/  
17.        }  
18.    }  

继续看run方法:

1.  protected void deployDescriptor(ContextName cn, File contextXml) {  
2.    
3.      DeployedApplication deployedApp =  
4.              new DeployedApplication(cn.getName(), true);  
5.    
6.      long startTime = 0;  
7.      // Assume this is a configuration descriptor and deploy it  
8.      if(log.isInfoEnabled()) {  
9.         startTime = System.currentTimeMillis();  
10.        log.info(sm.getString("hostConfig.deployDescriptor",  
11.                 contextXml.getAbsolutePath()));  
12.     }  
13.   
14.     Context context = null;  
15.     boolean isExternalWar = false;  
16.     boolean isExternal = false;  
17.     File expandedDocBase = null;  
18.   
19.     try (FileInputStream fis = new FileInputStream(contextXml)) {  
20.         synchronized (digesterLock) {  
21.             try {  
22.                 context = (Context) digester.parse(fis);/*使用digester创建context实例*/  
23.             } catch (Exception e) {  
24.                 log.error(sm.getString(  
25.                         "hostConfig.deployDescriptor.error",  
26.                         contextXml.getAbsolutePath()), e);  
27.             } finally {  
28.                 digester.reset();  
29.                 if (context == null) {  
30.                     context = new FailedContext();  
31.                 }  
32.             }  
33.         }  

digster解析的时候创建了对象:

1.  Class<?> clazz = Class.forName(host.getConfigClass());  
2.             LifecycleListener listener =  
3.                 (LifecycleListener) clazz.newInstance();  
4.             context.addLifecycleListener(listener);//为context添加生命周期监听器  
5.    
6.             context.setConfigFile(contextXml.toURI().toURL());//设置context实例的ConfigFile  
7.             context.setName(cn.getName());//设置context实例的名称  
8.             context.setPath(cn.getPath());//设置context实例的路径  
9.             context.setWebappVersion(cn.getVersion());  
10.            //设置context实例的版本  
11.            // Add the associated docBase to the redeployed list if it's a WAR  
12.            if (context.getDocBase() != null) {  
13.                File docBase = new File(context.getDocBase());  
14.                if (!docBase.isAbsolute()) {  
15.                    docBase = new File(host.getAppBaseFile(), context.getDocBase());  
16.                }  
17.                // If external docBase, register .xml as redeploy first  
18.                if (!docBase.getCanonicalPath().startsWith(  
19.                        host.getAppBaseFile().getAbsolutePath() + File.separator)) {  
20.                    isExternal = true;  
21.                    deployedApp.redeployResources.put(  
22.                            contextXml.getAbsolutePath(),  
23.                            Long.valueOf(contextXml.lastModified()));  
24.                    deployedApp.redeployResources.put(docBase.getAbsolutePath(),  
25.                            Long.valueOf(docBase.lastModified()));  
26.                    if (docBase.getAbsolutePath().toLowerCase(Locale.ENGLISH).endsWith(".war")) {  
27.                        isExternalWar = true;  
28.                    }  
29.                } else {  
30.                    log.warn(sm.getString("hostConfig.deployDescriptor.localDocBaseSpecified",  
31.                             docBase));  
32.                    // Ignore specified docBase  
33.                    context.setDocBase(null);  
34.                }  
35.            }  
36.   
37.            host.addChild(context);//把context的实例添加到host  
38.        } catch (Throwable t) {  
39.            ExceptionUtils.handleThrowable(t);  
40.            log.error(sm.getString("hostConfig.deployDescriptor.error",  
41.                                   contextXml.getAbsolutePath()), t);  
42.        } finally {  
43.            // Get paths for WAR and expanded WAR in appBase  
44.         //获得WAR包的路径并且展开WAR包在appBase里面  
45.            // default to appBase dir + name  
46.            expandedDocBase = new File(host.getAppBaseFile(), cn.getBaseName());  
47.            if (context.getDocBase() != null  
48.                    && !context.getDocBase().toLowerCase(Locale.ENGLISH).endsWith(".war")) {  
49.                // first assume docBase is absolute  
50.             //先假定这个docBase的路径是绝对的  
51.                expandedDocBase = new File(context.getDocBase());  
52.                if (!expandedDocBase.isAbsolute()) {  
53.                    // if docBase specified and relative, it must be relative to appBase  
54.                 //如果路径是相对的,那么它一定是相对于appBase  
55.                    expandedDocBase = new File(host.getAppBaseFile(), context.getDocBase());  
56.                }  
57.            }  
58.   
59.            boolean unpackWAR = unpackWARs;  
60.            if (unpackWAR && context instanceof StandardContext) {  
61.                unpackWAR = ((StandardContext) context).getUnpackWAR();  
62.            }  
63.   
64.            // Add the eventual unpacked WAR and all the resources which will be  
65.            // watched inside it  
66.            //添加最终解开的WAR包  
67.            if (isExternalWar) {  
68.                if (unpackWAR) {  
69.                    deployedApp.redeployResources.put(expandedDocBase.getAbsolutePath(),  
70.                            Long.valueOf(expandedDocBase.lastModified()));  
71.                    addWatchedResources(deployedApp, expandedDocBase.getAbsolutePath(), context);  
72.                } else {  
73.                    addWatchedResources(deployedApp, null, context);  
74.                }  
75.            } else {  
76.                // Find an existing matching war and expanded folder  
77.             //找到已存在的匹配的war包并且展开文件夹  
78.                if (!isExternal) {  
79.                    File warDocBase = new File(expandedDocBase.getAbsolutePath() + ".war");  
80.                    if (warDocBase.exists()) {  
81.                        deployedApp.redeployResources.put(warDocBase.getAbsolutePath(),  
82.                                Long.valueOf(warDocBase.lastModified()));  
83.                    } else {  
84.                        // Trigger a redeploy if a WAR is added  
85.                     //触发再次解析如果WAR包被添加进去  
86.                        deployedApp.redeployResources.put(  
87.                                warDocBase.getAbsolutePath(),  
88.                                Long.valueOf(0));  
89.                    }  
90.                }  
91.                if (unpackWAR) {  
92.                    deployedApp.redeployResources.put(expandedDocBase.getAbsolutePath(),  
93.                            Long.valueOf(expandedDocBase.lastModified()));  
94.                    addWatchedResources(deployedApp,  
95.                            expandedDocBase.getAbsolutePath(), context);  
96.                } else {  
97.                    addWatchedResources(deployedApp, null, context);  
98.                }  
99.                if (!isExternal) {  
100.                       // For external docBases, the context.xml will have been  
101.                       // added above.  
102.                       deployedApp.redeployResources.put(  
103.                               contextXml.getAbsolutePath(),  
104.                               Long.valueOf(contextXml.lastModified()));  
105.                   }  
106.               }  
107.               // Add the global redeploy resources (which are never deleted) at  
108.               // the end so they don't interfere with the deletion process  
109.               addGlobalRedeployResources(deployedApp);  
110.           }  
111.      
112.           if (host.findChild(context.getName()) != null) {  
113.               deployed.put(context.getName(), deployedApp);  
114.           }  
115.      
116.           if (log.isInfoEnabled()) {  
117.               log.info(sm.getString("hostConfig.deployDescriptor.finished",  
118.                   contextXml.getAbsolutePath(), Long.valueOf(System.currentTimeMillis() - startTime)));  
119.           }  
120.       }  

再看这个方法:

1.  public void addChild(Container child) {  
2.    
3.          child.addLifecycleListener(new MemoryLeakTrackingListener());  
4.    
5.          if (!(child instanceof Context))  
6.              throw new IllegalArgumentException  
7.                  (sm.getString("standardHost.notContext"));  
8.          super.addChild(child);/*最终会调用child.start()方法,在containerBase里面*/  
9.    
10.     }  
再看super.addChild():
public void addChild(Container child) {  
2.      if (Globals.IS_SECURITY_ENABLED) {  
3.          PrivilegedAction<Void> dp =  
4.              new PrivilegedAddChild(child);  
5.          AccessController.doPrivileged(dp);  
6.      } else {  
7.          addChildInternal(child);  
8.      }  
9.  }  

其实不管怎么样都会调用addChildInternal(child),
继续看这个里面的代码:

1.  private void addChildInternal(Container child) {  
2.    
3.        if( log.isDebugEnabled() )  
4.            log.debug("Add child " + child + " " + this);  
5.        synchronized(children) {  
6.            if (children.get(child.getName()) != null)  
7.                throw new IllegalArgumentException("addChild:  Child name '" +  
8.                                                   child.getName() +  
9.                                                   "' is not unique");  
10.           child.setParent(this);  // May throw IAE  
11.           children.put(child.getName(), child);  
12.       }  
13.   
14.       // Start child  
15.       // Don't do this inside sync block - start can be a slow process and  
16.       // locking the children object can cause problems elsewhere  
17.       try {  
18.           if ((getState().isAvailable() ||  
19.                   LifecycleState.STARTING_PREP.equals(getState())) &&  
20.                   startChildren) {  
21.               child.start();/*在这个地方调用的*/  
22.           }  
23.       } catch (LifecycleException e) {  
24.           log.error("ContainerBase.addChild: start: ", e);  
25.           throw new IllegalStateException("ContainerBase.addChild: start: " + e);  
26.       } finally {  
27.           fireContainerEvent(ADD_CHILD_EVENT, child);  
28.       }  
29.   }  

可以看到最终child.start(),在这个地方终于转向了StandardContext,
其他两个部署方法省略,感兴趣可以查看相关资料。
Tomcat8.5源码分析-StandardContext

NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 04-Nov-2025 16:03:22.475 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.鏈嶅姟鍣ㄧ増鏈? Apache Tomcat/8.5.91 04-Nov-2025 16:03:22.478 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鏈嶅姟鍣ㄦ瀯寤? Jul 6 2023 14:43:48 UTC 04-Nov-2025 16:03:22.479 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鏈嶅姟鍣ㄧ増鏈彿: 8.5.91.0 04-Nov-2025 16:03:22.479 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鎿嶄綔绯荤粺鍚嶇О: Windows 10 04-Nov-2025 16:03:22.480 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.鐗堟湰: 10.0 04-Nov-2025 16:03:22.480 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鏋舵瀯: amd64 04-Nov-2025 16:03:22.480 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 鐜鍙橀噺: C:\Program Files\Java\jdk-17.0.0.1 04-Nov-2025 16:03:22.480 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Java铏氭嫙鏈虹増鏈? 17.0.0.1+2-3 04-Nov-2025 16:03:22.480 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.渚涘簲鍟? Oracle Corporation 04-Nov-2025 16:03:22.481 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91 04-Nov-2025 16:03:22.481 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91 04-Nov-2025 16:03:22.481 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 --add-opens=java.base/java.lang=ALL-UNNAMED 04-Nov-2025 16:03:22.482 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 --add-opens=java.base/java.io=ALL-UNNAMED 04-Nov-2025 16:03:22.482 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 --add-opens=java.base/java.util=ALL-UNNAMED 04-Nov-2025 16:03:22.483 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 04-Nov-2025 16:03:22.483 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 04-Nov-2025 16:03:22.484 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.util.logging.config.file=C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\conf\logging.properties 04-Nov-2025 16:03:22.484 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 04-Nov-2025 16:03:22.484 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djdk.tls.ephemeralDHKeySize=2048 04-Nov-2025 16:03:22.485 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 04-Nov-2025 16:03:22.485 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dignore.endorsed.dirs= 04-Nov-2025 16:03:22.485 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcatalina.base=C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91 04-Nov-2025 16:03:22.486 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcatalina.home=C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91 04-Nov-2025 16:03:22.486 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.io.tmpdir=C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\temp 04-Nov-2025 16:03:22.486 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 浣跨敤APR鐗堟湰[1.7.4]鍔犺浇浜嗗熀浜嶢PR鐨凙pache Tomcat鏈満搴揫1.2.37]銆? 04-Nov-2025 16:03:22.487 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR鍔熻兘锛欼Pv6[true]銆乻endfile[true]銆乤ccept filters[false]銆乺andom[true]銆乁DS [{4}]銆? 04-Nov-2025 16:03:22.488 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL閰嶇疆锛 歶seAprConnector[false]锛寀seOpenSSL[true] 04-Nov-2025 16:03:22.495 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL鎴愬姛鍒濆鍖?[OpenSSL 1.1.1u 30 May 2023] 04-Nov-2025 16:03:22.534 淇℃伅 [main] org.apache.coyote.AbstractProtocol.init 鍒濆鍖栧崗璁鐞嗗櫒 ["http-nio-8080"] 04-Nov-2025 16:03:22.548 涓ラ噸 [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8080]] org.apache.catalina.LifecycleException: 鍗忚澶勭悊绋嬪簭鍒濆鍖栧け璐? at org.apache.catalina.connector.Connector.initInternal(Connector.java:1075) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:854) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.startup.Catalina.load(Catalina.java:646) at org.apache.catalina.startup.Catalina.load(Catalina.java:669) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:307) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:477) Caused by: java.net.BindException: Address already in use: bind at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(Net.java:555) at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337) at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294) at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:89) at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:226) at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:202) at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1318) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1331) at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:231) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:693) at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:76) at org.apache.catalina.connector.Connector.initInternal(Connector.java:1073) ... 13 more 04-Nov-2025 16:03:22.550 淇℃伅 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 413 ms 04-Nov-2025 16:03:22.583 淇℃伅 [main] org.apache.catalina.core.StandardService.startInternal 姝e湪鍚姩鏈嶅姟[Catalina] 04-Nov-2025 16:03:22.583 淇℃伅 [main] org.apache.catalina.core.StandardEngine.startInternal 姝e湪鍚姩 Servlet 寮曟搸锛歔Apache Tomcat/8.5.91] 04-Nov-2025 16:03:22.595 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰?[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\docs] 04-Nov-2025 16:03:22.852 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web搴旂敤绋嬪簭鐩綍[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\docs]鐨勯儴缃 插凡鍦╗255]姣鍐呭畬鎴? 04-Nov-2025 16:03:22.861 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰?[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\examples] 04-Nov-2025 16:03:23.204 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web搴旂敤绋嬪簭鐩綍[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\examples]鐨勯 儴缃插凡鍦╗343]姣鍐呭畬鎴? 04-Nov-2025 16:03:23.212 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰?[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\host-manager] 04-Nov-2025 16:03:23.271 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web搴旂敤绋嬪簭鐩綍[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\host-manager] 鐨勯儴缃插凡鍦╗58]姣鍐呭畬鎴? 04-Nov-2025 16:03:23.280 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰?[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\manager] 04-Nov-2025 16:03:23.323 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web搴旂敤绋嬪簭鐩綍[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\manager]鐨勯儴缃插凡鍦╗43]姣鍐呭畬鎴? 04-Nov-2025 16:03:23.329 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰?[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\ROOT] 04-Nov-2025 16:03:23.353 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web搴旂敤绋嬪簭鐩綍[C:\Users\Administrator\Desktop\apache-tomcat-8.5.91-windows-x64\apache-tomcat-8.5.91\webapps\ROOT]鐨勯儴缃 插凡鍦╗23]姣鍐呭畬鎴? 04-Nov-2025 16:03:23.356 淇℃伅 [main] org.apache.catalina.startup.Catalina.start Server startup in 804 ms
最新发布
11-05
"C:\Program Files\Java\jdk1.8.0_162\bin\java.exe" -Dcatalina.home=C:\Users\24256\4-tomcat8.5.75\apache-tomcat-8.5.75-windows-x64\apache-tomcat-8.5.75 -Dcatalina.base=C:\Users\24256\.SmartTomcat\Educational-administration-system-master -Djava.io.tmpdir=C:\Users\24256\.SmartTomcat\Educational-administration-system-master\temp -Djava.util.logging.config.file=C:\Users\24256\.SmartTomcat\Educational-administration-system-master\conf\logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -javaagent:C:\Users\24256\Desktop\2024\计算机\java\ideaIC-2024.2.1.win\lib\idea_rt.jar=60483:C:\Users\24256\Desktop\2024\计算机\java\ideaIC-2024.2.1.win\bin -Dfile.encoding=UTF-8 -classpath C:\Users\24256\4-tomcat8.5.75\apache-tomcat-8.5.75-windows-x64\apache-tomcat-8.5.75\bin\bootstrap.jar;C:\Users\24256\4-tomcat8.5.75\apache-tomcat-8.5.75-windows-x64\apache-tomcat-8.5.75\bin\tomcat-juli.jar org.apache.catalina.startup.Bootstrap start 24-Sep-2025 19:18:03.937 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/8.5.75 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Jan 17 2022 22:07:47 UTC 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 8.5.75.0 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Program Files\Java\jdk1.8.0_162\jre 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_162-b12 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\24256\.SmartTomcat\Educational-administration-system-master 24-Sep-2025 19:18:03.939 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: C:\Users\24256\4-tomcat8.5.75\apache-tomcat-8.5.75-windows-x64\apache-tomcat-8.5.75 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=C:\Users\24256\4-tomcat8.5.75\apache-tomcat-8.5.75-windows-x64\apache-tomcat-8.5.75 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=C:\Users\24256\.SmartTomcat\Educational-administration-system-master 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=C:\Users\24256\.SmartTomcat\Educational-administration-system-master\temp 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\24256\.SmartTomcat\Educational-administration-system-master\conf\logging.properties 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -javaagent:C:\Users\24256\Desktop\2024\计算机\java\ideaIC-2024.2.1.win\lib\idea_rt.jar=60483:C:\Users\24256\Desktop\2024\计算机\java\ideaIC-2024.2.1.win\bin 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dfile.encoding=UTF-8 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.0]加载了基于APR的Apache Tomcat本机库[1.2.31]。 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]。 24-Sep-2025 19:18:03.940 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true] 24-Sep-2025 19:18:03.943 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 1.1.1l 24 Aug 2021] 24-Sep-2025 19:18:04.022 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 24-Sep-2025 19:18:04.225 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 24-Sep-2025 19:18:04.234 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 532 ms 24-Sep-2025 19:18:04.262 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 24-Sep-2025 19:18:04.262 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/8.5.75] 24-Sep-2025 19:18:04.267 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor 正在部署部署描述符[C:\Users\24256\.SmartTomcat\Educational-administration-system-master\conf\Catalina\localhost\EducationalAdministrationSystemBasedOnSSM.xml]。 24-Sep-2025 19:18:04.441 警告 [localhost-startStop-1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [6.0]。将使用默认版本。 24-Sep-2025 19:18:04.464 警告 [localhost-startStop-1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [4.0]。将使用默认版本。 24-Sep-2025 19:18:06.634 信息 [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 2025-09-24 19:18:08 ERROR maxIdle is deprecated 24-Sep-2025 19:18:08.827 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor 部署描述符[C:\Users\24256\.SmartTomcat\Educational-administration-system-master\conf\Catalina\localhost\EducationalAdministrationSystemBasedOnSSM.xml]的部署已在[4,560]ms内完成 24-Sep-2025 19:18:08.829 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 24-Sep-2025 19:18:08.837 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 4602 ms http://localhost:8080/EducationalAdministrationSystemBasedOnSSM 24-Sep-2025 19:18:08.840 严重 [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]: java.net.BindException: Address already in use: JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) at java.net.ServerSocket.bind(ServerSocket.java:375) at java.net.ServerSocket.<init>(ServerSocket.java:237) at org.apache.catalina.core.StandardServer.await(StandardServer.java:414) at org.apache.catalina.startup.Catalina.await(Catalina.java:776) at org.apache.catalina.startup.Catalina.start(Catalina.java:722) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476) 24-Sep-2025 19:18:08.840 信息 [main] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"] 24-Sep-2025 19:18:08.976 信息 [main] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina] 24-Sep-2025 19:18:08.984 信息 [main] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler ["http-nio-8080"] 24-Sep-2025 19:18:08.988 信息 [main] org.apache.coyote.AbstractProtocol.destroy 正在摧毁协议处理器 ["http-nio-8080"] 进程已结束,退出代码为 0
09-25
C:\Users\wusaqi\Desktop\jdk8\bin\java.exe -Dcatalina.home=C:\Users\wusaqi\Desktop\tomcat\apache-tomcat-8.5.59 -Dcatalina.base=D:\mes\factory -Djava.io.tmpdir=D:\mes\factory\temp -Djava.util.logging.config.file=D:\mes\factory\conf\logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2025.2\lib\idea_rt.jar=61574" -Dfile.encoding=UTF-8 -classpath C:\Users\wusaqi\Desktop\tomcat\apache-tomcat-8.5.59\bin\bootstrap.jar;C:\Users\wusaqi\Desktop\tomcat\apache-tomcat-8.5.59\bin\tomcat-juli.jar org.apache.catalina.startup.Bootstrap start 13-Aug-2025 09:40:56.202 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/8.5.59 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Oct 6 2020 16:57:18 UTC 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号(: 8.5.59.0 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 10 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: x86 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Users\wusaqi\Desktop\jdk8\jre 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 1.8.0_60-b27 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Oracle Corporation 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: D:\mes\factory 13-Aug-2025 09:40:56.205 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: C:\Users\wusaqi\Desktop\tomcat\apache-tomcat-8.5.59 13-Aug-2025 09:40:56.205 信息
08-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值