我想知道两者之间的区别。从我的理解依赖需要一个版本等,但模块可以没有版本定义,它采用父版本。还有更多吗?
答案 0 :(得分:8)
依赖关系和模块是不同的概念。
来自Maven book关于依赖关系:
Maven可以管理内部和外部依赖关系。 Java项目的外部依赖项可能是库,例如Plexus,Spring Framework或Log4J。 Web应用程序项目根据包含服务类,模型对象或持久性逻辑的另一个项目来说明内部依赖关系。
简单地说,一个依赖关系说:"要构建我的项目,我需要使用这个库" 。
Maven中的依赖项由其coordinates定义,由4个元素组成:
groupId
:groupId
对一组相关工件进行分组。它通常类似于Java包名称。例如,groupId
org.apache.maven
是Apache Maven项目生成的所有工件的基础groupId
。artifactId
:artifactId
是项目主标识符。生成工件时,将使用artifactId
命名此工件。 artifactId
,groupId
组合必须是唯一的。换句话说,您不能拥有两个具有相同artifactId
和groupId
的单独项目。此外,对于给定的artifactId
,您不能拥有相同的groupId
。version
:发布工件时,会发布一个版本号,例如" 1.0"," 1.1.1"或&#34 ; 1.1.2-α-01&#34 ;.您还可以使用所谓的快照版本来处理正在开发的组件,例如" 1.0-SNAPSHOT"。classifier
:不需要分类器,通常不使用。只有当您需要从单个项目中生成多个工件时才有意义:它然后用作文件名中的区别,否则将仅使用artifactId
和version
进行冲突,从而产生冲突。 在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-project
和another-project
。因此,当您构建my-parent
时,也将构建这两个模块。
答案 1 :(得分:2)
从概念上讲,它们是不同的,但它们也是相辅相成的。
按照惯例,所有父项,模块和库都是引用,使用由group-id,artifact-id和version组成的唯一名称。除非你不需要(很少发生在我身上),模块确实可以从父级继承它的版本,但你可以选择更改它。
maven module就像是项目的子项目。它允许您将大型项目分成可以单独管理的较小部分,最后汇总以构建您需要的任何内容。我们可以将汽车描绘成最终产品,由发动机,车轮,椅子等几个模块组成。
依赖项是项目或模块编译和/或运行所需的库。回到我们的汽车,它确实需要一个发动机模块才能运转。但是,当前版本的发动机本身需要某种类型(版本)的活塞才能正确运行。太大了,它们不合适,太小,根本不起作用。
应用于java项目,您可以想象有几个模块可以访问数据库,调用一些Web服务,提供UI,所有这些模块都由父项链接在一起。此外,DB模块可能需要某个DB驱动程序(MYSql,Oracle等),与您正在使用的DB版本匹配,Web服务模块与HTTP库匹配,等等。