为具有SmartClient架构的项目设置Maven的最佳方法是什么?请考虑以下包:
当然每个都有几个子包。客户端和服务器都使用核心。我看到两个主要选择:
以下是我们需要构建的输出(至少):
选项#1是否可行?如果是这样,这是好的做法吗?从我最初的研究来看,选项#2听起来像是最佳实践。然而,当所有代码密切相关时,从POM跳到POM听起来像额外的工作和我们可能不需要的额外混乱。我应该坚持使用选项#2吗?
答案 0 :(得分:1)
Maven有一个一般规则,即每个项目应该只有一个工件。换句话说,选项#1不允许您生成server.war,client.jar等,而不会与maven作斗争。这将是一个很大的混乱,你将无法利用maven插件。不,真的,你不想要这个。所以只需选择#2选项,其结构如下(省略src
目录):
.
|-- core
| `-- pom.xml
|-- server
| `-- pom.xml
|-- client
| `-- pom.xml
`-- pom.xml
关于从POM跳转到POM的问题,好吧,只需将所有模块导入IDE,你就不会注意到它。这对很多人来说都很有效。
更新(在评论中涵盖OP的问题):
与Maven战斗听起来并不好玩。
不,你会松开:)
根级别的pom.xml中有什么内容?
这是用于Project Aggregation的父POM。引用Introduction to the POM文档:
Project Aggregation类似于 项目继承。而不是 从中指定父POM 模块,它指定模块 父母POM。通过这样做, 父项目现在知道它的模块, 如果调用了Maven命令 对于父项目,即Maven 然后命令将执行到 父母的模块也是如此。去做 Project Aggregation,你必须这样做 以下内容:
- 将父POM包装更改为值“pom”。
- 在父POM中指定其模块的目录(子项 多金属氧酸盐)
项目聚合和项目继承通常一起使用。有关详细信息,请参阅上述文档。
“每个项目的单个工件”是否意味着Standalone.jar,Server.war和Client.jar(三个总POM)应该有一个单独的POM?
是的,这就是我的意思,一个项目生成一个工件(有一些例外,但99%的情况下都是如此)。这是你应该(必须)遵循的最佳实践。
如果我还想要一个包含Grizzly的简单服务器Server.jar怎么办?服务器不需要两个POM吗?
我认为处理此问题的主要方法是使用assemblies并且您的问题没有唯一的答案(这可能是上述规则的例外情况之一)。但这不会阻止你开始。
此外,如何开始构建会导致所有三个工件生成?
在我们看到的聚合项目中启动您的maven命令(也称为“多模块构建”)。