【問題】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,點擊查看

相關文章
相關標籤/搜索