Maven:“依赖与模块”

时间:2016-02-23 21:55:30

标签: maven maven-3

我想知道两者之间的区别。从我的理解依赖需要一个版本等,但模块可以没有版本定义,它采用父版本。还有更多吗?

2 个答案:

答案 0 :(得分:8)

依赖关系和模块是不同的概念。

来自Maven book关于依赖关系:

  

Maven可以管理内部和外部依赖关系。 Java项目的外部依赖项可能是库,例如Plexus,Spring Framework或Log4J。 Web应用程序项目根据包含服务类,模型对象或持久性逻辑的另一个项目来说明内部依赖关系。

简单地说,一个依赖关系说:"要构建我的项目,我需要使用这个库"

Maven中的依赖项由其coordinates定义,由4个元素组成:

  • groupIdgroupId对一组相关工件进行分组。它通常类似于Java包名称。例如,groupId org.apache.maven是Apache Maven项目生成的所有工件的基础groupId
  • artifactIdartifactId是项目主标识符。生成工件时,将使用artifactId命名此工件。 artifactIdgroupId组合必须是唯一的。换句话说,您不能拥有两个具有相同artifactIdgroupId的单独项目。此外,对于给定的artifactId,您不能拥有相同的groupId
  • version:发布工件时,会发布一个版本号,例如" 1.0"," 1.1.1"或&#34 ; 1.1.2-α-01&#34 ;.您还可以使用所谓的快照版本来处理正在开发的组件,例如" 1.0-SNAPSHOT"。
  • classifier:不需要分类器,通常不使用。只有当您需要从单个项目中生成多个工件时才有意义:它然后用作文件名中的区别,否则将仅使用artifactIdversion进行冲突,从而产生冲突。

POM中,它看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <dependencies>
    <dependency>
      <groupId>org.some.project</groupId>
      <artifactId>my-project</artifactId>
      <version>4.0</version>
    </dependency>
    ...
  </dependencies>
  ...
</project>

这声明了对由给定坐标标识的my-project库的依赖。

multi-module Maven project的上下文中使用模块。来自Maven的书:

  

多模块项目只管理一组其他子项目或模块。 [...]在设置多模块项目时,您只是告诉项目其构建应包含指定的模块。多模块构建将用于在单个构建中将模块组合在一起。

简单地说,让模块说&#34;要构建我的项目,我需要构建这个项目&#34;

POM中,这样做是这样的:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-parent</artifactId>
  <version>2.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>my-project</module>
    <module>another-project</module>
  </modules>
</project>

您说这个由org.codehaus.mojo:my-parent:2.0:pom标识的项目声明了2个模块my-projectanother-project。因此,当您构建my-parent时,也将构建这两个模块。

答案 1 :(得分:2)

从概念上讲,它们是不同的,但它们也是相辅相成的。

按照惯例,所有父项,模块和库都是引用,使用由group-id,artifact-id和version组成的唯一名称。除非你不需要(很少发生在我身上),模块确实可以从父级继承它的版本,但你可以选择更改它。

maven module就像是项目的子项目。它允许您将大型项目分成可以单独管理的较小部分,最后汇总以构建您需要的任何内容。我们可以将汽车描绘成最终产品,由发动机,车轮,椅子等几个模块组成。

依赖项是项目或模块编译和/或运行所需的库。回到我们的汽车,它确实需要一个发动机模块才能运转。但是,当前版本的发动机本身需要某种类型(版本)的活塞才能正确运行。太大了,它们不合适,太小,根本不起作用。

应用于java项目,您可以想象有几个模块可以访问数据库,调用一些Web服务,提供UI,所有这些模块都由父项链接在一起。此外,DB模块可能需要某个DB驱动程序(MYSql,Oracle等),与您正在使用的DB版本匹配,Web服务模块与HTTP库匹配,等等。