我是Maven的新手。我有一个多模块maven 2项目,具有以下结构(稍微简化):
Project (POM packaging)
|
+-- Module1 (JAR)
| |
| +-- src
| |
| +-- main
| |
| +-- java
| +-- resources
|
+-- Module2 (JAR)
| |
| ...
|
+-- Web Module (WAR)
|
...
我已将网络模块配置为包含Maven Jetty plugin。
这非常适合构建生产工件。对于开发,我发现我需要在我更改的任何模块上调用mvn install
,然后停止jetty并调用jetty:再次运行。
如果有一种方法可以让插件直接从每个模块的目标目录中选择更改,那么效率会更高。根据jetty插件文档,似乎有这样的功能,但它似乎只适用于WAR模块
对我来说更重要的是能够更改资源文件,而无需重新启动jetty。这是因为大多数资源都是HTML模板文件,在开发过程中设计和更新模板的效率极高,而无需重新启动以查看更改。
那么,有没有办法设置jetty插件的类路径以包含每个JAR模块的目标/类和资源目录,而不是本地存储库中的实际JAR?
谢谢!
参见Yaniv
答案 0 :(得分:7)
多模块Maven项目无法做到这一点。 Maven项目的一个基本规则是每个项目都应该能够独立存在。这并不妨碍它们一起构建,但任何一个项目都应该能够自己构建,只要满足它的所有依赖关系。
在这种情况下,这意味着WAR项目无法查看其他项目以查看是否需要更新,其他项目的POM是确定构建工件需要做什么的明确声明。一旦构建了工件,它就被放在本地存储库中。此时源文件和工件之间没有关联,因此无法确定哪些源文件会触发重建WAR所依赖的工件。
答案 1 :(得分:3)
在Eclipse中,您可以使用“Run Jetty”插件来实现此目的 在IDEA的运行配置中,有一个选项'解决工作空间工件',请检查它。
答案 2 :(得分:2)
如果您使用M2Eclipse(Eclipse插件在Eclipse中紧密集成Maven),您可以在Web模块中运行您的jetty:run目标,并且将从您的工作区考虑其他依赖项,即使它们是在本地存储库中根本没有。
您的运行中只有一个选项可以告诉Maven在工作区本身中解析您的模块(默认情况下,它只会获取本地存储库中部署的内容)。
不幸的是,我在IDEA中不能有相同的行为,我必须在运行jetty之前运行安装:在web模块上运行。
答案 3 :(得分:1)
根据这个答案:Best practice wrt. `mvn install`, multi-module projects, and running one submodule 围绕Mavens可怕的限制和反应堆限制的解决方法是使用skip true在父pom中定义插件,然后使用skip false在相应的子模块中重新启用它。
答案 4 :(得分:1)