Maven 有一个通用规则,即每个项目应该只有一个工件。换句话说,选项 #1 不允许您在不与 maven 对抗的情况下生成 server.war、client.jar 等。这将是一团糟,您将无法利用 Maven 插件。不,真的,你不想要这个。因此,只需选择选项 #2,其结构如下(省略src
目录):
.
|-- core
| `-- pom.xml
|-- server
| `-- pom.xml
|-- client
| `-- pom.xml
`-- pom.xml
关于您对从 POM 跳转到 POM 的担忧,好吧,只需将所有模块导入您的 IDE,您不会真正注意到它。这对很多人来说效果很好。
更新(在评论中涵盖来自 OP 的问题):
与 Maven 战斗听起来并不有趣。
不,你会失去:)
根级别的 pom.xml 中有什么?
这是用于Project Aggregation的父 POM 。引用POM文档的介绍:
项目聚合类似于项目继承。但不是从模块中指定父 POM,而是从父 POM 中指定模块。通过这样做,父项目现在知道它的模块,并且如果针对父项目调用 Maven 命令,那么该 Maven 命令也将被执行到父项目的模块。要进行项目聚合,您必须执行以下操作:
- 将父 POM 包装更改为值 "pom" 。
- 在父 POM 中指定其模块的目录(子 POM)
项目聚合和项目继承经常一起使用。有关详细信息,请参阅上述文档。
“每个项目一个工件”是指 Standalone.jar、Server.war 和 Client.jar(总共三个 POM)应该有一个单独的 POM?
是的,这就是我的意思,一个项目生成一个工件(有一些例外,但 99% 的时间都是如此)。这是您应该(必须?)遵循的最佳实践。
如果我还想要一个 Server.jar,一个包含 Grizzly 的简单服务器怎么办?服务器不需要两个 POM 吗?
我认为处理这个问题的 maven 方法是使用程序集,并且您的问题没有唯一的答案(这可能是上述规则的例外之一)。但这不会阻止你开始。
此外,如何启动一个将导致所有三个工件都生成的构建?
如我们所见(又名“多模块构建”),从聚合项目启动您的 maven 命令。