SmartClient项目的Maven用法

时间:2010-01-14 20:17:25

标签: java maven-2 enterprise smartclient

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

  • myproject.core
  • myproject.server
  • myproject.client

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

  1. 在myproject中创建一个超级POM来覆盖所有三个,并有一些构建参数来确定要构建的内容。
  2. 在上面的每个包中创建一个POM(一个用于核心,另一个用于服务器,另一个用于客户端)。
  3. 以下是我们需要构建的输出(至少):

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

    选项#1是否可行?如果是这样,这是好的做法吗?从我最初的研究来看,选项#2听起来像是最佳实践。然而,当所有代码密切相关时,从POM跳到POM听起来像额外的工作和我们可能不需要的额外混乱。我应该坚持使用选项#2吗?

1 个答案:

答案 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命令(也称为“多模块构建”)。