maven如何找到Java编译器?

我是新手学习maven,遵循sonatype的书给出的这个例子。这是一个最简单的pom.xml文件(工作正常)。 但我的问题是,maven(mvn install)如何在我的机器上安装Java编译器(javac)? 此POM文件不以任何方式指定JDK。 谢谢你的解释。

编辑:作为比较,我正在按照书中的下一个例子,这次,我收到了一个编译错误,因为它无法找到javax.My java文件所在,如书中所示: src/main/java/org/sonatype/mavenbook/web/SimpleServlet.java

现在我运行mvn编译,我收到下面的错误信息。 为什么现在maven找不到编译器:

 ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project simple-webapp: Compilation failure: Compilation failure: [ERROR] /home/abigail/study/simple-webapp/src/main/java/org/sonatype/mavenbook/web/SimpleServlet.java:[4,1] package javax.servlet does not exist 

的pom.xml

  4.0.0 org.sonatype.mavenbook.simpleweb simple-webapp war 1.0-SNAPSHOT simple-webapp Maven Webapp http://maven.apache.org   junit junit 3.8.1 test    simple-webapp   maven-compiler-plugin  1.7 1.7      

如果你走这条路,请使用maven version 3.2.3

 apache-maven-3.2.3-bin\apache-maven-3.2.3\bin 

看看mvn.bat ,你可以在下面看到

@REM Maven2启动批处理脚本

@REM必需的ENV vars:

@REM JAVA_HOME – JDK主目录的位置

显然,它从您的环境变量中选择JAVA_HOME 。 来自文件的代码片段。

 @REM ==== START VALIDATION ==== if not "%JAVA_HOME%" == "" goto OkJHome :OkJHome if exist "%JAVA_HOME%\bin\java.exe" goto chkMHome :chkMHome if not "%M2_HOME%"=="" goto valMHome 

对于问题,javax.servlet

  javax.servlet javax.servlet-api 3.0.1 provided  

或任何可用的

  javax.servlet servlet-api 2.5 provided  

Maven使用环境变量JAVA_HOME来查找JDK。

由于maven本身是一个java应用程序,它只是默认为运行maven目标的jdk。

要获得更多编译选项,您必须使用:

http://maven.apache.org/plugins/maven-compiler-plugin/

看看这个:

http://maven.apache.org/plugins/maven-compiler-plugin/examples/compile-using-different-jdk.html

编辑:

对于你的后续问题:如果你查看mvn可执行文件(默认情况下在/ usr / bin / mvn中),你会发现它是一个相当冗长的bash脚本,花费了大量的时间来查找jdk的位置。 当然,您可以设置JAVA_HOME系统属性并“帮助”脚本,但即使您没有它,它也会尝试找到它,并且只有当它失败时才会发出错误。

从/ usr / bin / mvn:

 if [ -z "$JAVA_HOME" ]; then javaExecutable="`which javac`" if [ -n "$javaExecutable" -a ! "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. readLink=`which readlink` if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then javaExecutable="`readlink -f \"$javaExecutable\"`" javaHome="`dirname \"$javaExecutable\"`" javaHome=`expr "$javaHome" : '\(.*\)/bin'` JAVA_HOME="$javaHome" export JAVA_HOME fi fi 

 if [ -z "$JAVACMD" ] ; then if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi else JAVACMD="`which java`" fi fi 

实际上,脚本的大部分代码都与确定使用哪个java以及java所在的位置有关。 但是,一旦你运行mvn可执行文件,这并不限制它使用相同的jdk进行编译/运行它自己运行 。 这里是mvn编译器插件的用武之地,您可以在其中指定要使用的其他jdk安装。

所以我只是让maven从我的默认位置获取不同的Java位置:

Java8

 [tomek:~] $ java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode) 

但是maven拿起了Java9

 [tomek:~] $ mvn -version Apache Maven 3.3.9 Maven home: /usr/share/maven Java version: 9-internal, vendor: Oracle Corporation Java home: /usr/lib/jvm/java-9-openjdk-amd64 

没有设置JAVA_HOME:

 [tomek:~] $ echo "Java HOME: $JAVA_HOME" Java HOME: 

所以我怀疑它只是在ubuntu上引入第一个替代品(忽略用户选择):

 [tomek:~] $ sudo update-alternatives --config java There are 3 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ 0 /usr/lib/jvm/java-9-openjdk-amd64/bin/java 1091 auto mode * 1 /opt/java/jdk1.8.0_144/bin/java 1 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode 3 /usr/lib/jvm/java-9-openjdk-amd64/bin/java 1091 manual mode