一直没配过,都是使用免安装的。但今天客户有其他公司的tomcat,只能再

起一个。但启动时闪退,在tomcat下看不到日志。经查询启动日志跑到原有的另一个tomcat下了,报的是端口冲突。但端口已经改了。经查询发现配置了环境变量指向了原tomcat目录。

解决办法:

方法一:再配置一个tomcat环境变量。

1.配置CATALINA_BASE2和CATALINA_HOME2指向tomcat目录,如下:

2.打开catalina.bat和startup.bat文件,将所有的CATALINA_BASE替换成CATALINA_BASE2,将所有的CATALINA_HOME替换成CATALINA_HOME2。重启即可。

注意:有说将bin下所有bat中的CATALINA_BASE和CATALINA_HOME都全部替换,博主认为没必要

方法二:只做方法一的第2步,省略第1步

 方法三:在catalina.bat和startup.bat文件里第一行添加

set “CATALINA_HOME=D:\apache-tomcat-7.0.69”
set “CATALINA_BASE=D:\apache-tomcat-7.0.69”

如下

 

 

原理:参考https://blog.csdn.net/kevinwuwenboa/article/details/52976424可知

tomcat容器启动时创建bootstrap对象调用init方法,设置catalinahome和catalinabase,

public void init()  
        throws Exception  
    {  
  
        // Set Catalina path  
        // 设置catalina_home属性,tomcat启动脚本里有通过-Dcatalina.home设置  
        setCatalinaHome();  
        // 设置catalina_base属性,运行多实例的时候该目录与catalina_home不同  
        setCatalinaBase();  
  
        // 初始化classloader,读取conf/catalina.properties,根据指定的repository创建classloader  
        // 有三个classloader   分别是common、catalina、shared,tomcat6中三个相同  
        initClassLoaders();  
        // 设置当前线程的classloader  
        Thread.currentThread().setContextClassLoader(catalinaLoader);  
        // 待研究  
        SecurityClassLoad.securityClassLoad(catalinaLoader);  
  
        // 以下通过反射调用Catalina中的方法  
        // Load our startup class and call its process() method  
        if (log.isDebugEnabled())  
            log.debug("Loading startup class");  
        Class startupClass =  
            catalinaLoader.loadClass  
            ("org.apache.catalina.startup.Catalina");  
        Object startupInstance = startupClass.newInstance();  
  
        // Set the shared extensions class loader  
        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] = sharedLoader;  
        Method method =  
            startupInstance.getClass().getMethod(methodName, paramTypes);  
        method.invoke(startupInstance, paramValues);  
  
        catalinaDaemon = startupInstance;  
  
    }

View Code

-Dcatalina.home和-Dcatalina.base的设置在catalina.bat中完成,因此要更改catalina.bat文件。

 

至于startup.bat与方法二,打开startup.bat文件看如下几行代码

发现处理了的catalina_home的各种情况。

至于方法三的原理,相当于类中设置了成员变量,就不用公用的了

 

版权声明:本文为yanan7890原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yanan7890/p/8954887.html