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

原创
2015/01/21 14:41
阅读数 381

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

    问题:

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

    

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

    原因:

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

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


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

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

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

    解决方法:

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

    

    然后启动便可,在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. 图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,点击查看

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部