maven如何找到Java编译器?

maven如何找到Java编译器?,java,maven,Java,Maven,通过遵循sonatype的书中给出的示例,我对学习maven还不熟悉。这是一个最简单的pom.xml文件(工作正常)。但我的问题是,maven(mvn安装)如何找到安装在我机器上的Java编译器(javac)?这个POM文件没有以任何方式指定JDK。谢谢你的解释 编辑: 作为比较,我遵循书中的下一个示例,这次我收到了一个编译错误,因为它找不到javax。我的java文件在中,正如书中所建议的:src/main/java/org/sonatype/mavenbook/web/SimpleServl

通过遵循sonatype的书中给出的示例,我对学习maven还不熟悉。这是一个最简单的pom.xml文件(工作正常)。但我的问题是,maven(mvn安装)如何找到安装在我机器上的Java编译器(javac)?这个POM文件没有以任何方式指定JDK。谢谢你的解释

编辑: 作为比较,我遵循书中的下一个示例,这次我收到了一个编译错误,因为它找不到javax。我的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

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                         http://maven.apache.org/maven-    v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook.simpleweb</groupId>
<artifactId>simple-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <finalName>simple-webapp</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

4.0.0
org.sonatype.mavenbook.simpleweb
简单网络应用
战争
1.0-快照
简单webapp Maven webapp
http://maven.apache.org
朱尼特
朱尼特
3.8.1
测试
简单网络应用
maven编译器插件
1.7
1.7

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

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

再看看这个:

编辑:

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

从/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


实际上,脚本的大部分代码都与确定要使用哪个java以及该java位于何处有关但是,一旦运行了mvn可执行文件,这并不限制它使用与自身运行时相同的jdk进行编译/运行。这里是mvn编译器插件发挥作用的地方,您可以在这里指定要使用的其他jdk安装。

Maven使用环境变量
JAVA\u HOME
来查找jdk。

如果您选择此路径,请使用
Maven版本3.2.3

apache-maven-3.2.3-bin\apache-maven-3.2.3\bin
选择mvn.bat,您可以看到下面的内容

@REM Maven2启动批处理脚本

@REM所需环境变量:

@REM JAVA_HOME-JDK HOME目录的位置

显然,它从您的环境变量中选择
JAVA\u 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

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

javax.servlet
javax.servlet-api
3.0.1
假如
或任何可用的

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

javax.servlet
servlet api
2.5
假如

所以我让maven从我的默认设置中选择不同的Java位置:

爪哇8

但是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_主页:

[tomek:~] $ echo "Java HOME: $JAVA_HOME"
Java HOME:
所以我怀疑它只是在ubuntu上带来了第一种选择(忽略用户的选择):


默认运行maven目标的JDK?这是因为JDK安装在/usr/bin/directory中,所以maven可以直接访问它,而无需任何其他规范吗?请注意:我发现maven查找JDK(是JDK,不是JRE)的方法有点缺陷。JAVA_HOME env var最初用于JRE位置,因此它可能指向您机器上的JRE位置,不是因为Maven,而是因为该主机上的其他应用程序。因此,您可能需要在
mvn.bat | sh
周围有一个包装器,以适当地设置JAVA|u HOME env var+我有这个变量集,但不确定它是否重要。是的,我看到了。谢谢你能理解为什么我上面的例子maven找不到javax吗?谢谢。为什么servlet必须作为依赖项包含?它也是JDK标准包的一部分。不,它不是——它是JEE的一部分。
[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
[tomek:~] $ echo "Java HOME: $JAVA_HOME"
Java HOME:
[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