问题: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,点击查看