看到过很多讲设置JVM的文章写把JVM参数写在Tomcat的catalina.sh(*nix系统中脚本扩展名为sh,Windows系统中脚本扩展名为bat,主文件名相同,以下只以*nix系统为例)文件中,但实际上Tomcat的catalina.sh文件中的注释内容,明确说明不要将变量放在其中,而要放在setenv.sh文件中,以实现用户自定义变量和系统脚本的分离。(“Do not set the variables in this script. Instead put them into a script setenv.sh in CATALINA_BASE/bin to keep your customizations separate.”)
setenv.sh文件默认情况是不存在的,如果需要设置用户自定义变量的话,则需要用户自己在CATALINA_BASE/bin或CATALINA_HOME/bin路径下创建,如果这两个变量对应的实际路径不同,并且两个路径都存在setenv.sh文件,则只有CATALINA_BASE/bin下的生效。另外,如果是在Windows系统下将Tomcat注册为服务来启动,则不支持setenv.bat中的设置,用户自定义变量需要保存在Windows的注册表中,可以使用tomcatXw.exe文件来维护(X为版本号),详见catalina.sh脚本中的注释和RUNNING.TXT。
将用户自定义变量放在setenv.sh文件中和系统脚本分离,好处在易于维护,比如:在升级Tomcat版本时不需要修改新的catalina.sh来加上原来设置的内容,直接覆盖原路径的catalina.sh(或者是复制setenv.sh到新路径)就可以了;加了什么设置,以后其他人来维护的话,打开setenv.sh文件也一目了然,不用在有很多行代码的catalina.sh文件中查找;避免了修改catalina.sh时将原脚本内容意外改错的情况发生。而坏处则只是需要新建一个脚本文件。何乐而不为呢?
另外,希望大家重视文档的作用,多看成熟产品的文档,多写、多维护自己代码的文档。