24

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

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

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

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

谢谢!
亚尼夫

4

5 回答 5

7

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

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

于 2010-12-07T03:33:45.400 回答
3

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

于 2013-07-16T07:10:20.817 回答
2

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

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

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

于 2011-02-10T19:03:45.183 回答
1

基于这个答案:Best practice wrt。`mvn install`、多模块项目和运行一个子模块 解决 Maven 可怕的限制和反应器限制的解决方法是在父 pom 中使用 skip true 定义插件,然后在相应的子模块中使用 skip false 重新启用它。

于 2016-03-24T12:19:32.543 回答
1

我通过使用 maven 启动器和配置Resolve Workspace artifacts 解决了,默认情况下未选中在此处输入图像描述

于 2017-11-01T02:29:37.277 回答