首页 » 软件开发 » Maven入门5 - POM(项目配置继承变量目录)

Maven入门5 - POM(项目配置继承变量目录)

南宫静远 2024-07-23 23:42:29 0

扫一扫用手机浏览

文章目录 [+]

很多配置都有默认值,比如源代码目录是src/main/java,测试源代码目录是src/test/java,构建目录是target等等。

执行任务或目标时,Maven在当前目录中查找POM。
它读取POM,获取所需的配置信息,然后执行目标。

可以在POM中指定的配置有项目依赖项、可以执行的插件或目标、构建profiles等等。
还可以指定其他信息,如项目版本、说明、开发人员、邮件列表等。

Maven入门5 - POM(项目配置继承变量目录) 软件开发
(图片来自网络侵删)
Super POM

即Maven的默认POM,包含很多默认配置。

所有POM都会继承Super POM,除非显示设置。
所以Super POM中的配置都会被我们创建的POM继承过来,这就是默认配置。

下面是Maven 3.6.3的Super POM:

<project> <modelVersion>4.0.0</modelVersion> <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories> <build> <directory>${project.basedir}/target</directory> <outputDirectory>${project.build.directory}/classes</outputDirectory> <finalName>${project.artifactId}-${project.version}</finalName> <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> </testResource> </testResources> <pluginManagement> <!-- NOTE: These plugins will be removed from future versions of the super POM --> <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) --> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.8</version> </plugin> <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> </plugin> </plugins> </pluginManagement> </build> <reporting> <outputDirectory>${project.build.directory}/site</outputDirectory> </reporting> <profiles> <!-- NOTE: The release profile will be removed from future versions of the super POM --> <profile> <id>release-profile</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <plugin> <inherited>true</inherited> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-javadoc-plugin</artifactId> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-deploy-plugin</artifactId> <configuration> <updateReleaseInfo>true</updateReleaseInfo> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project>最小的POM

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version></project>

一个POM必须配置groupId、artifactId、version,这三个值形成项目工件的全限定名,<groupId>:<artifactId>:<version>,比如:com.mycompany.app:my-app:1

其他未配置但必需的,则会使用默认值。
比如,每个Maven项目都会有一个packaging类型,如果没有配置,那么默认是jar。

又比如,如果没有配置repositories,那么会Maven会使用Super POM中配置的repositories,即依赖都从https://repo.maven.apache.org/maven2下载。

项目继承(Project Inheritance)

子POM会将父POM中的下列配置合并过来:

dependenciesdevelopers and contributorsplugin lists (including reports)plugin executions with matching idsplugin configurationresources

Super POM就是项目继承的一个例子。
当然,我们也可以引入自己的父POM。

还是使用上面的项目 com.mycompany.app:my-app:1。

假设要开发另外一个项目 com.mycompany.app:my-module:1,它的POM是这样的:

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version></project>

现在,我们要把项目com.mycompany.app:my-app:1转变为项目com.mycompany.app:my-module:1的父项目,只需要修改项目com.mycompany.app:my-module:1的POM即可:

<project> <modelVersion>4.0.0</modelVersion> <parent><!-- 指定父项目 --> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> </parent> <groupId>com.mycompany.app</groupId><!-- 可以省略,将继承父项目的groupId --> <artifactId>my-module</artifactId> <version>1</version><!-- 可以省略,将继承父项目的version --></project>

这样,项目com.mycompany.app:my-module:1就可以继承父项目的所有配置了。

上面的<parent>元素的配置只适用于父项目已经安装在本地仓库或者将这两个项目的目录结构设计为:

如果父项目没有安装在本地仓库且两个项目的目录结构也不是上面那样,该怎么办?假设目录结构是这样的:

现在我们只需要在<parent>元素添加一个<relativePath>元素指定父项目的路径即可:

<parent> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> <relativePath>../parent/pom.xml</relativePath><!-- 指定父项目的路径 --> </parent>项目聚合(Project Aggregation)

项目继承是在子项目中指定父项目。

而项目聚合则是在父项目中指定子项目。

项目继承是为了子项目能够继承父项目中的配置。

而项目聚合则是为了在为父项目执行Maven命令时,自动的为所有子项目执行相同的命令,有点类似于批量执行Maven命令。

假设有两个项目,原来的POM是这样的。

com.mycompany.app:my-app:1的POM:

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version></project>

com.mycompany.app:my-module:1的POM:

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-module</artifactId> <version>1</version></project>

它们的目录结构是这样的:

现在要把my-module聚合到my-app中,我们只需要修改my-app的POM即可:

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1</version> <packaging>pom</packaging><!-- 打包类型改为pom --> <modules><!-- 指定子项目 --> <module>my-module</module><!-- 指定子项目的相对路径,最后一级一般与项目工件名相同 --> </modules></project>

如果它们的目录结构变为:

那么只需这样修改即可:

<modules> <module>../my-module</module> </modules>项目继承 vs 项目聚合

如果多个Maven项目有类似的配置,那么把类似的配置抽出来形成父项目,子项目只要继承父项目即可获得那些配置,减少了子项目中的重复配置。

如果有一组项目需要一起构建和处理,那么创建一个父项目把它们作为模块/子项目,只要构建父项目就会自动的构建所有的子项目,减少了子项目的逐个构建。

当然,我们可以同时使用这两种技术,那么就可以同时获得这两种好处。
POM修改只需要三步:

为每个子POM指定父POM将父POM的packaging的值配置为pom在父POM中指定子项目/模块所在的目录。
变量

还是为了解决重复性的问题。
有时候需要在多个位置使用同一个值,这时候就我们可以使用POM预定义的或者我们自定义的变量。

比如,我们可以这样访问 project.version 这个变量:

<version>${project.version}</version>

注意:变量是在继承之后处理的,所以,如果父项目使用变量,则其值最终可能是子项目中所定义的值。

变量有三类:

POM本身的变量:只要是具有单个值的元素,都可作为变量,比如:${project.groupId}、${project.version}、${project.build.sourceDirectory},这些变量都是以 project. 开头的。
特殊的变量:project.basedir:当前项目所在的目录。
project.baseUri :当前项目所在的目录,使用URI表示。
maven.build.timestamp :构建开始的UTC时间戳。
时间戳的格式可以自定义(格式的标准参考java.text.SimpleDateFormat):

<project> ... <properties> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format> </properties> ...</project>自己定义的属性:

<project> ... <properties> <!-- 这里是自定义的属性 --> <mavenVersion>3.0</mavenVersion> </properties> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <version>${mavenVersion}</version><!-- 引用自定义属性 --> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> <version>${mavenVersion}</version> </dependency> </dependencies> ...</project>

标签:

相关文章

语言中的借用,文化交融的桥梁

自古以来,人类社会的交流与发展离不开语言的传播。在漫长的历史长河中,各民族、各地区之间的文化相互碰撞、交融,产生了许多独特的语言现...

软件开发 2025-01-01 阅读1 评论0

机顶盒协议,守护数字生活的新卫士

随着科技的飞速发展,数字家庭逐渐走进千家万户。在这个时代,机顶盒成为了连接我们与丰富多彩的数字世界的重要桥梁。而机顶盒协议,作为保...

软件开发 2025-01-01 阅读1 评论0

语言基础在现代社会的重要性及方法步骤

语言是人类沟通的桥梁,是社会发展的基础。语言基础作为语言学习的基石,对于个人、社会乃至国家的发展具有重要意义。本文将从语言基础在现...

软件开发 2025-01-01 阅读2 评论0

粤语电影,传承文化,点亮时代之光

粤语电影,作为中国电影产业的一朵奇葩,以其独特的地域特色、丰富的文化内涵和鲜明的艺术风格,赢得了广大观众的喜爱。本文将从粤语电影的...

软件开发 2025-01-01 阅读1 评论0

苹果游戏语言,塑造未来娱乐体验的基石

随着科技的飞速发展,游戏产业逐渐成为全球娱乐市场的重要支柱。在我国,游戏产业更是蓬勃发展,吸引了无数玩家和投资者的目光。而在这其中...

软件开发 2025-01-01 阅读1 评论0