如何在 maven jetty 插件中指定 JDK

Posted

技术标签:

【中文标题】如何在 maven jetty 插件中指定 JDK【英文标题】:How to specify JDK in maven jetty plugin 【发布时间】:2016-07-08 20:51:59 【问题描述】:

? 像这样:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>$jetty-maven-plugin.version</version>
    <configuration>
        <scanIntervalSeconds>2</scanIntervalSeconds>
        <webApp>
            <contextPath>/$project.build.finalName</contextPath>
            <jettyEnvXml>$project.basedir/src/over/here/jetty-env.xml</jettyEnvXml>
        </webApp>
        <httpConnector>
            <port>8080</port>
        </httpConnector>
        <!--<executable>$env.JAVA_IBM_HOME/bin/javac</executable>-->
    </configuration>
</plugin>

请注意:excutable标签不正确,我只是用它作为例子。

【问题讨论】:

指定 JDK 是什么意思?你通常设置在maven-complier-plugin @ Shmulik Klein,感谢您的回复。是的,你是对的。我知道 maven-complier-plugin 可以为每个 maven 模块指定 JDK 版本。但我想为 maven-jetty 插件指定 JDK 版本。当 maven-jetty 运行时,maven-complier 插件无法生效。 maven-jetty 似乎与系统(OS)环境 JDK 版本一起运行。这不是我需要的。 @ShmulikKlein 不仅在那里,而且我认为不仅仅是编译,请检查我的答案 【参考方案1】:

澄清一下:您实际上想指定一个可执行文件,因此可能是 JRE(Java 运行时环境)而不是 JDK(Java 开发工具包)。虽然 JDK 确实也可以用作 JRE,但我认为这是需要澄清的。

关于您的问题,没有这样的想法来指定用于执行某个 Maven 插件的不同 JDK/JRE:插件作为 mvn 命令的一部分执行,而该命令又使用系统 JDK 执行/JRE 默认情况下(在路径中设置),它实际上是一个调用普通 Java 主程序的脚本,是的,Maven 它是用 Java 编写的,它的执行从 Java 主程序开始,以下是说清楚:

org.codehaus.plexus.classworlds.launcher.Launcher#main

如果您想更改用于启动此 main 的 JRE,您需要预先更改 JAVA_HOME 变量,正如 old SO post 所解释的那样。

所以你需要以下内容:

set JAVA_HOME=path_to_your_different_jdk
mvn jetty:run

在您的 IDE 中,根据您在答案中发布的屏幕截图,您实际上是在做同样的事情:设置必须使用哪个 JVM。

对于大多数插件来说都是如此,除非预见到特定的分叉机制。例如:

Maven Surefire Plugin 通过reuseForks 选项和jvm 选项提供了分叉机制,这也说明了:

用于指定jvm(或java 可执行文件的路径)以与forking 选项一起使用的选项。默认情况下,jvm 将是与用于运行 Maven 的虚拟机相同的虚拟机的新实例。

然后将使用指定的 JVM(JRE 或用作 JRE 的 JDK)来执行测试(基本上与您正在寻找的关于 Jetty Maven 插件的场景相同。

Maven Compiler Plugin 还提供了一个fork 选项,然后可以使用executable 选项,您可以有效地指向不同的JDK(在这种情况下不是JRE)来编译您的代码。

设置当forktrue 时使用的编译器的可执行文件。

Jetty Maven Plugin 是作为 Maven 命令的一部分执行的(同样,使用 JAVA_HOME 变量或系统默认值指定的 JRE 的 Java 主程序),在其官方文档中也有指定:

正在运行的 Jetty 及其部署的 webapp 的类路径由 Maven 管理 ... 例如,您可能需要在 Jetty 的分叉实例中运行您的 webapp,而不是在运行 Maven 的进程中;

确实提供了run-forked 目标

此目标允许您在新的 JVM 中启动 webapp,可选择将参数传递给新的 JVM。此目标支持与 jetty:run 目标相同的配置参数,并带有一些附加功能来帮助配置分叉进程。

然而,此选项主要用于将different arguments 传递给 Jetty,而不是不同的可执行文件(例如,如果您已经为 Maven 设置了相同的参数并且您希望它为 Jetty 运行使用不同的值)。因此,再一次,该选项不存在(指定用于此分叉执行的可执行文件/jvm)。很遗憾,因为他们几乎是带着这个目标到达那里的。

【讨论】:

【参考方案2】:

我想我自己得到了答案,但是我仍然不知道如何在 maven xml 文件中进行操作,如果您知道,请告诉我。

【讨论】:

以上是关于如何在 maven jetty 插件中指定 JDK的主要内容,如果未能解决你的问题,请参考以下文章

idea 模块jdk依赖总是自动变为jdk1.5

Maven集成jetty插件

使用maven jetty插件在java 8上运行jetty 9时出现错误扫描文件[重复]

如何在 Android Studio 中指定 JDK 版本?

如何在 Maven/Mortbay Jetty 插件中使用 https / ssl?

如何在 Webpack 插件中指定多个加载器?