tomcat配置环境变量
一直没配过,都是使用免安装的。但今天客户有其他公司的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的各种情况。
至于方法三的原理,相当于类中设置了成员变量,就不用公用的了