关于环境变量的理解,maven有没有必要配置MAVEN_HOME或M2_HOME,tomcat一定要设置JAVA_HOME环境变量吗

前言

本文讨论关于环境变量的理解,maven有没有必要配置MAVEN_HOME或M2_HOME,tomcat一定要设置JAVA_HOME环境变量吗

关于环境变量

我们知道配置环境变量后,访问命令可以省略一长串的路径,直接通过 “短名” 即可。例如在Windows平台安装了JDK我们会配置一下JAVA_HOME变量,然后再把 %JAVA_HOME%\bin 配置在Path里,这样在访问 java.exe 的时候就不需要指定全路径,在任何地方都可以访问 java(扩展名可省略)

Mac跟Windows的环境变量是一样的道理,也是为了在任何地方可以访问。

但是,我们是不是有个疑问,环境变量的变量名(例如这里的JAVA_HOME)是可以随便乱取的吗? 答案是不确定的。

因为就像Windows里定义的TEMPTMP变量,难道不是一种约定吗? 比如我开发一个PC软件,如果要写临时文件,我只要获取 %TEMP%%TMP% 即可得到这两个变量代表的路径进而写入临时文件。如果不是约定,那千千万万的开发者各自写一个路径,是不是很乱?

既然环境变量名不能随便起名,回到刚刚的问题,这就是为什么变量叫 JAVA_HOME 而不是其他名字(如 JDK_HOME、JVM_HOME)。 这就是一种约定

已知的一些软件,比如maven、tocmat等的启动脚本都会从约定的名字JAVA_HOME中尝试获取命令。当然maven和tomcat做了兼容,即使获取不了JAVA_HOME,只要能执行java,也不会爆错,但是保不齐某些软件的脚本不做兼容,所以环境变量名还是不能随便取

maven 的环境变量

下面以maven3.6.1为例(其他版本应该差不多)

网上的教程可能比较乱。有说MAVEN_HOME的,有说M2_HOME的,配置该变量后再引用定义的变量到path里。据说 MAVEN_HOME 是maven1的时候的配置,M2_HOME是maven2以上的版本的配置(包括现在的maven3也是配M2_HOME,注意不是M3_HOME!!)

不过官方的教程是对配置M2_HOME只字未提
参考这里

注意
官方的意思就是不用配置任何环境变量,不用配MAVEN_HOME或M2_HOME,直接引入到Path里即可(无论是Windows还是Mac都不需要!),直接配置在Path里(Windows)或export /xxx/yyy/bin:$PATH(Mac),其中 /xxx/yyy/bin是maven的bin目录

  • 但是Windows平台必须配置JAVA_HOME,Mac不需要
  • PS:maven干嘛需要jdk?需要打包所以需要编译!即使是jre都不行!必须jdk

JDK的环境变量

我们一样怀疑,有没有必要配置JAVA_HOME环境变量?

对于maven

以maven3.6.1为例(其他版本应该差不多)

  • Windows平台:是有必要的,只要maven的mvn.cmd里引用了名为JAVA_HOME的变量,找不到就会报错。他并不会从where java中获取路径!!!
  • Mac平台:不需要配置JAVA_HOME,看maven的mvn里的脚本就知道它找不到JAVA_HOME环境变量的时候会通过which java命令来找到。而刚好Mac在安装JDK的时候就会把可执行命令拷贝到直接能访问的路径下,所以Mac平台不配置JAVA_HOME,其maven也是可以跑的
对于tomcat

以tomcat9.0.26为例(其他版本应该也差不多)

PS: 跟maven不一样,tomcat运行部需要编译,所以也可以是jre,当然jdk也是可以的(jdk包含jre)

  • Windows平台:是有必要的,否则启动一闪就关闭了(启动的脚本startup.bat中有对catalina.bat的调用,catalina.bat的脚本中有JAVA_HOME的引用(可以看到细节,如果JAVA_HOME没配置,可以使用JRE_HOME,并且同时配置的时候优先使用JRE_HOME)
  • Mac平台:可以不配置JAVA_HOME,看startup.sh会调用catalina.sh,catalina.sh中会调用setclasspath.sh获取到运行需要的JAVA_HOME或JRE_HOME,由于mac系统执行/usr/libexec/java_home就能够获取安装的jdk的路径,所以便取到了值。

从打印的启动日志可以看出,不配置JAVA_HOME默认使用JRE_HOME

Stone-MacBookPro15:bin stonewang$ ./startup.sh 
Using CATALINA_BASE:   /Users/stonewang/dev/tomcats/apache-tomcat-9.0.26
Using CATALINA_HOME:   /Users/stonewang/dev/tomcats/apache-tomcat-9.0.26
Using CATALINA_TMPDIR: /Users/stonewang/dev/tomcats/apache-tomcat-9.0.26/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home
Using CLASSPATH:       /Users/stonewang/dev/tomcats/apache-tomcat-9.0.26/bin/bootstrap.jar:/Users/stonewang/dev/tomcats/apache-tomcat-9.0.26/bin/tomcat-juli.jar
Tomcat started.

你可能感兴趣的:(Java高级)