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

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

    问题:

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

    【问题】Tomcat中 执行tomcat7.exe报错_第1张图片

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

    原因:

  1.     安装版本直接点tomcat7.exe,是因为在安装的时候,

    【问题】Tomcat中 执行tomcat7.exe报错_第2张图片

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


  2. 所以,在运行tomcat的时候我们就能直接点击tomcat7.exe

  3.     在eclipse里面启动tomcat也是可以的

        在eclpse中配置的tomcat,也并不是以tomcat服务启动的,而是启动tomcat程序,相当于启动startup.bat,所以不需要安装tomcat服务。

    解决方法:

    1、安装tomcat服务:service.bat install [service_name]

    【问题】Tomcat中 执行tomcat7.exe报错_第3张图片

    然后启动便可,在window服务中查看,于是就能启动tomcat服务了。当service_name不存在时会默认

    

    要删除tomcat服务:service.bat remove [service_name],如果安装的时候命名了删除的时候也是需要名称的。

    2、直接点击tomcat下面的startup.bat来启动。

    延伸:

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

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

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

    3. 【问题】Tomcat中 执行tomcat7.exe报错_第4张图片图1

      【问题】Tomcat中 执行tomcat7.exe报错_第5张图片图2


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

  2.     tomcat启动过程

  3. startup.bat调用了catalina.bat,catalina.bat从命令行启动org.apache.catalina.startup.Bootstrap,这个类有main方法,看一下bootstrap源码

    【问题】Tomcat中 执行tomcat7.exe报错_第6张图片

    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服务器的核心工作。


    原创作者twosnail(两只蜗牛)

你可能感兴趣的:(tomcat,安装tomcat服务,tomcat7.exe启动报错)