Maven 马文:“我不知道。”;依赖关系与模块”;

Maven 马文:“我不知道。”;依赖关系与模块”;,maven,maven-3,Maven,Maven 3,我想知道两者的区别。据我所知,依赖项需要一个版本等,但模块可以在没有版本的情况下定义,它采用父版本。还有更多吗?依赖项和模块是不同的概念 从“关于依赖项”部分: Maven可以管理内部和外部依赖关系。Java项目的外部依赖可能是一个库,如Plexus、Spring框架或Log4J。web应用程序项目依赖于包含服务类、模型对象或持久性逻辑的另一个项目来说明内部依赖关系 简单地说,依赖项是这样说的:“要构建我的项目,我需要使用这个库” Maven中的依赖项由其定义,由4个元素组成: groupI

我想知道两者的区别。据我所知,依赖项需要一个版本等,但模块可以在没有版本的情况下定义,它采用父版本。还有更多吗?

依赖项和模块是不同的概念


从“关于依赖项”部分:

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

简单地说,依赖项是这样说的:“要构建我的项目,我需要使用这个库”

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

  • groupId
    groupId
    对一组相关工件进行分组。它通常类似于Java包名。例如,
    groupId
    org.apache.maven
    是ApacheMaven项目生成的所有工件的基础
    groupId
  • artifactId
    artifactId
    是项目的主要标识符。当您生成一个工件时,这个工件将被命名为
    artifactId
    artifactId
    groupId
    组合必须是唯一的。换句话说,您不能有两个具有相同
    artifactId
    groupId
    的独立项目。此外,对于给定的
    groupId
    ,您不能拥有相同的
    artifactId
  • version
    :发布工件时,会使用版本号发布,例如“1.0”、“1.1.1”或“1.1.2-alpha-01”。您还可以为正在开发的组件使用快照版本,如“1.0-snapshot”
  • 分类器
    :不需要且通常不使用分类器。只有当您需要从单个项目中生成多个工件时,它才是相关的:然后它在文件名中起到区别作用,否则只需使用
    artifactId
    version
    即可进行区分,从而产生冲突
在中,它看起来是这样的:

<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>
<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
标识的项目声明了两个模块,它们分别是
我的项目
另一个项目
。因此,当您构建我的父模块时,这两个模块也将被构建。

从概念上讲,它们是不同的,但它们也同时存在

按照惯例,所有这些组件、模块和库都使用由组id、工件id和版本组成的唯一名称进行引用。除非您另有需要(我很少遇到),否则模块确实可以从父模块继承其版本,但您可以选择更改它

A类似于项目的子项目。它允许您将一个大项目划分为更小的部分,这些部分可以单独管理,并最终聚合以构建您需要的任何内容。我们可以把汽车想象成最终产品,由发动机、车轮、椅子等几个模块组成

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


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

对汽车的示例进行了很好的解释,使其更容易可视化!谢谢。@SoltanG我很高兴,很高兴这对你有帮助。结合Tunaki在技术上更详细的回答,您应该有一个更清晰的概述。一个模块可以像依赖关系一样被不同的项目多次使用吗?@jon你有具体的例子吗?通常,模块生成的工件安装在公司的存储库中,这样它们就可以在其他项目中重用。我现在终于明白了。我有一个“pom”项目,它有3个模块(数据模型、utils和helpers),这个pom项目是我的API项目的父项目。在api中,这3个模块现在是依赖项。现在我开始一个新的微服务项目,我还需要3个相同的依赖项。不再需要将它们作为模块。谢谢,所以我假设包含的模块本身需要定义pom(它本身是一个单独的项目),而依赖项可能只是存储库中不需要pom的工件?谢谢。@SoltanG好吧,如果它是maven repo中的一个依赖项,那么它应该有自己的pom来描述它自己可能依赖的其他库,这样maven在构建项目时也可以下载它们。您的依赖项的依赖项被称为。然而,pom是由制作它们的人定义的,您只需要在项目/模块中引用它们,然后神奇就会发生:-)@Morfic谢谢。我明白了。如果这是我们在回购协议中维护的依赖关系,那么我们也会有一个Pom。谢谢。一个模块可以像依赖项一样被不同的项目多次使用吗?@jon是的,因为在这种情况下,您会将其视为依赖项(注意“使用”一词)。最初的模块可以用作同一版本的另一个模块的依赖项,也可以完全用作其他项目的依赖项。