如何让 Maven 编译器插件正常工作而不会出现 tools.jar not found 错误?

How to get maven compiler plugin to work without failing with tools.jar not found error?

我们在一个奇怪的 unix-ish 开发平台下使用 maven 时遇到了一些问题。 Maven 编译器插件抱怨无法找到 tools.jar,因为在默认安装的 java.

中存在奇怪的 JDK/JRE 混淆
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:
      2.5.1:compile (default-compile) on project xyz: Fatal error compiling:
      tools.jar not found: our-java-home-dir/../lib/tools.jar -> [Help 1]

../lib/tools.jar 实际上应该是 lib/tools.jar。 java 安装 (Java 7) 似乎是 JDK 但不知何故 java 检测到它只是一个 JRE,因此造成了混乱。在查看 java 代码在做什么时,它一定认为我们安装了 JRE 并且期望 JAVA_HOME 指向真实 [=15= 的 jre 子目录].再多的复制、符号链接或其他骇客手段似乎都无法让我们使 ../liblib 相同。

我们在 intertubes 上看到了很多类似的问题,但 none 很有帮助。我们无法像您在其他平台上那样重新安装 Java 或任何解决方案,但它应该是完整的 JDK 并且包括 bin 中的所有 j*tools子目录。

... tools.jar not found: our-java-home-dir/../lib/tools.jar -> [Help 1]

对我们来说似乎有效的一个解决方案是手动将 tools.jar 文件强制到 maven 命令的 boot-class-path 上。我们使用以下程序转储 boot-class-path 的当前值:

public class Main {
    public static void main(String[] args) {
        System.out.println("Boot-class-path=" +
            System.getProperty("sun.boot.class.path"));
    }
}

然后我们修改$M2_HOME/bin/mvn中mvn脚本的末尾插入-Xbootclasspath选项:

$MAVEN_OPTS \
    -Xbootclasspath:existing-boot-class-path-here:${JAVA_HOME}/lib/tools.jar \
    -additional-maven-options-go-here...

我们将 tools.jar 条目添加到上面主程序吐出的值的末尾。当然,您还需要保留其他 Maven 选项。

希望这对其他人有帮助。