【问题标题】:Maven: How to use jetty:run in a multi-module Maven project, without needing to installMaven:如何使用jetty:在多模块Maven项目中运行,无需安装
【发布时间】:2022-02-03 03:29:52
【问题描述】:

我是 Maven 新手。我有一个多模块 maven 2 项目,它具有以下结构(有些简化):

Project (POM packaging)
  |
  +-- Module1 (JAR)
  |     |
  |     +-- src
  |          |
  |          +-- main
  |               |
  |               +-- java
  |               +-- resources
  |
  +-- Module2 (JAR)
  |      |
  |     ...
  |
  +-- Web Module (WAR)
         |
        ...

我已将 Web 模块配置为包含 Maven Jetty plugin。 这对于构建生产工件非常有用。对于开发,我发现我需要在我更改的任何模块上调用 mvn install,然后停止 jetty 并再次调用 jetty:run。
如果插件有办法直接从每个模块的目标目录中选择更改,那将会更有效率。根据码头插件文档,似乎有这样一个功能,但似乎这只适用于 WAR 模块。
对我来说更重要的是能够对资源文件进行更改,而无需重新启动码头。这是因为大部分资源都是 HTML 模板文件,在开发过程中设计和更新模板的效率大大提高,无需重新启动即可查看更改。

那么,有没有办法将 jetty 插件的类路径设置为包含每个 JAR 模块的目标/类和资源目录,而不是本地存储库中的实际 JAR?

谢谢!
亚尼夫

【问题讨论】:

  • 好问题!这个我也想不通。如果你弄明白了,请在这里发布答案。

标签: maven-2 jetty maven-plugin maven-jetty-plugin


【解决方案1】:

这对于多模块 Maven 项目是不可能的。 Maven 项目的一个基本规则是每个项目都应该能够独立存在。这并不妨碍它们一起构建,但是只要满足所有依赖项,任何一个项目都应该能够自行构建。

在这种情况下,这意味着 WAR 项目无法查看其他项目以查看它们是否需要更新,其他项目的 POM 是构建工件需要做什么的明确声明。一旦构建了工件,它就会被放入本地存储库中。此时源文件和工件之间没有关联,因此无法判断哪些源文件会触发重建 WAR 所依赖的工件。

【讨论】:

  • 这太可怕了。作为来自其他构建系统的人,我真的很讨厌这种限制,并希望这不是真的。 Maven 知道哪些模块驻留在文件系统中,因为它们是在父文件的 pom.xml 中指定的。因此,它应该能够始终重建这些项目。它不需要做任何超级智能的事情,但总是重建的选项会很好。
  • 没有人使用 Maven 构建以实现快速迭代。将您的项目加载到 IDE 中……IntelliJ IDEA、Eclipse 或 Netbeans 都了解如何解析 Maven 项目,如果您没有特殊的插件(或者插件只需要在特定文件更改后运行),您将永远不要将这些视为您特别关心的问题。
  • 那么如何在 Web 应用中进行快速迭代呢?您是否在 IDE 中执行了某些操作而不是“mvn jetty:run”?或者我猜答案基本上是你不能为一个 web 应用程序进行快速迭代,并且不得不一直重新安装你的项目?
  • 我非常喜欢将项目导入到我的 IDE 中。我使用 IntelliJ IDEA,它可以通过单击构建和部署到六个不同的容器,包括 Tomcat、Jetty、Glassfish 和 Spring DM(在 IDEA x 中)。 jetty:run 目标非常适合已签入并且只需要下载者轻松运行的项目,但对于迭代开发来说根本不是一个好的选择。
  • 您应该能够找到一个 Eclipse 插件,该插件可以在 Eclipse 中运行 Jetty,作为迭代周期的一部分自动连接到调试器。
【解决方案2】:

在 Eclipse 中,您可以使用“Run Jetty”插件来实现这一点。
在IDEA的运行配置中,有一个选项'Resolve Workspace artifacts',勾选即可。

【讨论】:

    【解决方案3】:

    如果您使用 M2Eclipse(用于在 Eclipse 中紧密集成 Maven 的 Eclipse 插件),您可以在 web 模块中运行您的 jetty:run 目标,并且您的工作区中的其他依赖项将被考虑在内,即使它们是在您的本地存储库中根本不可用。

    在您的运行中只有一个选项可以告诉 Maven 在工作区本身中解析您的模块(默认情况下,它只会获取部署在本地存储库中的内容)。

    不幸的是,我在 IDEA 中不能有相同的行为,我必须在运行 jetty:run 在 web 模块上之前运行安装。

    【讨论】:

    【解决方案4】:

    基于这个答案:Best practice wrt. `mvn install`, multi-module projects, and running one submodule 围绕 Maven 可怕的限制和反应器限制的解决方法是在父 pom 中使用 skip true 定义插件,然后在相应的子模块中使用 skip false 重新启用它。

    【讨论】:

      【解决方案5】:

      我通过使用 maven 启动器并配置 Resolve Workspace artifacts 解决了问题, 默认不勾选

      【讨论】:

        猜你喜欢
        • 2019-10-20
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多