2

为具有 SmartClient 架构的项目设置 Maven 的最佳方法是什么?考虑以下软件包:

  • 我的项目核心
  • 我的项目服务器
  • 我的项目.client

当然,每个都有几个子包。客户端和服务器都使用核心。我看到两个主要选项:

  1. 在 myproject 中创建一个 uber-POM 以涵盖所有三个,并具有某种构建参数来确定要构建的内容。
  2. 在上面的每个包中制作一个 POM(一个用于核心,另一个用于服务器,另一个用于客户端)。

以下是我们需要构建的输出(至少):

  • Standalone.jar:将启动服务器和客户端的测试应用程序。
  • Server.war:可以部署到 Tomcat 的 WAR 文件。
  • Client.jar:没有任何服务器代码的 SmartClient。

选项#1甚至可能吗?如果是这样,这是一个好习惯吗?从我最初的研究来看,选项 #2 听起来像是最佳实践。但是,当所有代码都密切相关时,从 POM 跳转到 POM 听起来像是我们可能不需要的额外工作和额外混乱。我应该坚持选择#2吗?

4

1 回答 1

1

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 命令。

于 2010-01-14T22:28:41.563 回答