【问题】Tomcat中 执行tomcat7.exe报错

The system cannot find the Registry key for service 'tomcat7'

    问题:java

   在启动解压后的tomcat7,点击bin下面的tomcat7.exe失败了,报错“The system cannot find the Registry key for service 'tomcat7'”。
git

    

    回想,以前的安装版本直接点tomcat7.exe也能够的呀,在eclipse里面启动tomcat也是能够的呀,为何这里就报错了呢?github

    缘由:apache

  1.     安装版本直接点tomcat7.exe,是由于在安装的时候,bootstrap

    这里咱们已经安装了tomcat服务,名字为Tomcat7,在window服务中就会存在tomcat


  2. 因此,在运行tomcat的时候咱们就能直接点击tomcat7.exe服务器

  3.     在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来启动。

    延伸:

  1.  startup.bat与tomcat7.exe的区别

    1. 两个均可以启动tomcat,而tomcat7.exe必须安装了服务才能启动,而startup.bat不须要;

    2. tomcat7.exe是服务模式运行的(图1),startup.bat是Doc窗口运行的(图2)

    3. 图1

      图2


    4. startup.bat在Linux中固然对应的就是startup.sh

  2.     tomcat启动过程

  3. 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,点击查看

相关文章
相关标签/搜索