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