問題:java
在啓動解壓後的tomcat7,點擊bin下面的tomcat7.exe失敗了,報錯「The system cannot find the Registry key for service 'tomcat7'」。
git
回想,以前的安裝版本直接點tomcat7.exe也能夠的呀,在eclipse裏面啓動tomcat也是能夠的呀,爲何這裏就報錯了呢?github
緣由:apache
安裝版本直接點tomcat7.exe,是由於在安裝的時候,bootstrap
這裏咱們已經安裝了tomcat服務,名字爲Tomcat7,在window服務中就會存在tomcat
因此,在運行tomcat的時候咱們就能直接點擊tomcat7.exe服務器
在eclipse裏面啓動tomcat也是能夠的app
在eclpse中配置的tomcat,也並非以tomcat服務啓動的,而是啓動tomcat程序,至關於啓動startup.bat,因此不須要安裝tomcat服務。eclipse
解決方法:
ui
一、安裝tomcat服務:service.bat install [service_name]
而後啓動即可,在window服務中查看,因而就能啓動tomcat服務了。當service_name不存在時會默認
要刪除tomcat服務:service.bat remove [service_name],若是安裝的時候命名了刪除的時候也是須要名稱的。
二、直接點擊tomcat下面的startup.bat來啓動。
延伸:
startup.bat與tomcat7.exe的區別
兩個均可以啓動tomcat,而tomcat7.exe必須安裝了服務才能啓動,而startup.bat不須要;
tomcat7.exe是服務模式運行的(圖1),startup.bat是Doc窗口運行的(圖2)
圖1
圖2
startup.bat在Linux中固然對應的就是startup.sh
tomcat啓動過程
startup.bat調用了catalina.bat,catalina.bat從命令行啓動org.apache.catalina.startup.Bootstrap,這個類有main方法,看一下bootstrap源碼
init方法以下,而後調用load()和start()方法:
public void init() throws Exception { setCatalinaHome(); setCatalinaBase(); initClassLoaders(); Thread.currentThread().setContextClassLoader(this.catalinaLoader); SecurityClassLoad.securityClassLoad(this.catalinaLoader); if (log.isDebugEnabled()) log.debug("Loading startup class"); Class startupClass = this.catalinaLoader.loadClass("org.apache.catalina.startup.Catalina"); Object startupInstance = startupClass.newInstance(); if (log.isDebugEnabled()) log.debug("Setting startup class properties"); String methodName = "setParentClassLoader"; Class[] paramTypes = new Class[1]; paramTypes[0] = Class.forName("java.lang.ClassLoader"); Object[] paramValues = new Object[1]; paramValues[0] = this.sharedLoader; Method method = startupInstance.getClass().getMethod(methodName, paramTypes); method.invoke(startupInstance, paramValues); this.catalinaDaemon = startupInstance; }
init方法前面幾句,初始化cacatalina類。設置catalina.home,catalina.base的環境變量,和初始化三個類加載器。
而後,構件好的catalinaLoader加載tomcat最核心的對象org.apache.catalina.startup.Catalina類的對象catalinaDaemon
main下面
String command = "start"; if (args.length > 0) { command = args[(args.length - 1)]; } if (command.equals("startd")) { args[(args.length - 1)] = "start"; daemon.load(args); daemon.start(); } else if (command.equals("stopd")) { args[(args.length - 1)] = "stop"; daemon.stop(); } else if (command.equals("start")) { daemon.setAwait(true); daemon.load(args); daemon.start(); } else if (command.equals("stop")) { daemon.stopServer(args); } else if (command.equals("configtest")) { daemon.load(args); if (null == daemon.getServer()) { System.exit(1); } System.exit(0); } else { log.warn(new StringBuilder().append("Bootstrap: command \"").append(command).append("\" does not exist.").toString()); }
setAwait(),設置了Catalina對象的一個屬性值,告訴服務器啓動後保持運行狀態,並開啓特定端口監聽後續發來的指令,直到收到SHUTDOWN指令,作關閉服務器處理。
load(),是加載和初始化。對整個Tomcat服務器相關的配置文件進行加載和解析處理,並對Tomcat的各個組件進行初始化配置操做。
start(),是正式啓動Catalina,或者說啓動了Tomcat服務器的核心工做。
原創做者:博客已經遷移至github,點擊查看