很多笔记及实例摘录自《Maven权威指南》
可选依赖
编译这个项目的时候你需要两个依赖类库,但是你不希望在使用你类库的项目中,这两个依赖类库同时作为传递性运行时依赖出现。
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>1.4.1</version> <optional>true</optional> </dependency>
依赖版本界限
可以指定一个满足给定依赖的版本界限。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[3.8,4.0)</version> <scope>test</scope> </dependency>
(, )不包含量词 [, ]包含量词
JUnit <= 3.8.1 [,3.8.1]
传递性依赖 与 冲突解决
<exclusions><exclusion>
classifier
如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier). 例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,它们有同样的groupId:artifactId:version组合。
项目继承
指定parent-a的POM的相对位置
<parent> <groupId>org.sonatype.mavenbook</groupId> <artifactId>a-parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../a-parent/pom.xml</relativePath> </parent>
过滤资源
<build> <filters> <filter>src/main/filters/default.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
配置额外的资源目录
<build> <resources> <resource> <directory>src/main/images</directory> </resource> </resources> </build>
过滤脚本资源
<resources> <resource> <filtering>true</filtering> <directory>/usr/local/xxx <includes> <include>run.bat</include> <include>run.sh</include> </includes> <targetPath>/usr/xxxx </resource> <resource> <directory>/usr/local/xxxx </resource> </resources>
初始的站点描述符
<project name="Sample Project"> <bannerLeft> <name>Sonatype</name> <src>images/logo.png</src> <href>http://www.sonatype.com</href> </bannerLeft> <body> <menu name="Sample Project"> <item name="Overview" href="index.html"/> </menu> <menu ref="reports"/> </body> </project>
给站点描述符添加Banner Left和Banner Right
<project name="Sample Project"> <bannerLeft> <name>Left Banner</name> <src>images/banner-left.png</src> <href>http://www.xxx.com</href> </bannerLeft> <bannerRight> <name>Right Banner</name> <src>images/banner-right.png</src> <href>http://www.xxx.com</href> </bannerRight> ... </project>
配置发布日期格式
<project name="Sample Project"> ... <publishDate position="navigation-bottom" format="yyyy-MM-dd"/> ... </project>
Maven套件
<pluginManagement> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-2</version> <executions> <execution> <id>create-project-bundle</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptorRefs> <descriptorRef>project</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> </plugin> </plugins>
Assembly插件原生支持多种归档格式jar
zip,tar,bzip2,gzip,tar.gz,tar.bz2,rar,war,ear,sar,dir
<assembly>
<id>bundle</id>
<formats>
<format>zip</format>
</formats>
...
</assembly>
files套件
files元素是套件描述符中最简单的部分,它被设计成定义那些相对与你项目目录的路径。
使用该元素,你就可以完全控制哪些文件被包含到你的套件中,它们如何被命名,以及它们在归档中的位置。
<files> <file> <source>target/my-app-1.0.jar</source> <outputDirectory>lib</outputDirectory> <destName>my-app.jar</destName> <fileMode>0644</fileMode> </file> </files>
”会将你项目的JAR文件包含到套件的lib/目录下,同时除去了文件名的版本部分,使最终的文件名为my-app.jar。
该描述符会让这个JAR文件对于所有人可读,对于拥有者可写(这就是0664模式的意思,这里使用了Unix四位十进制数的权限标记)
FileSets 元素
fileSets应用于那些相对于你的项目结构有一个明确位置的文件。
<fileSets> <fileSet> <directory>src/main/java</directory> </fileSet> </fileSets>
使用fileSet包含文件
<assembly> ... <fileSets> <fileSet> <directory>src/main/java</directory> <outputDirectory>src/main/java</outputDirectory> <includes> <include>**</include> </include> <useDefaultExcludes>true</useDefaultExcludes> <fileMode>0644</fileMode> <directoryMode>0755</directoryMode> </fileSet> </fileSets> “**”表示匹配一个或者多个目录,“*”表示匹配文件名的任一部分,“?”表示匹配文件名中的任意单个字符。 </assembly>
dependencySets
files和fileSets只是处理你项目中的文件,而依赖文件不存在于你的项目中。
自定义依赖输出目录
<assembly> ... <dependencySets> <dependencySet> <outputDirectory>org.sonatype.mavenbook</outputDirectory> <outputFileNameMapping> ${module.artifactId}.${module.extension} </outputFileNameMapping> </dependencySet> </dependencySets> ... </assembly>
使用范围来定义依赖组,依赖排除和包含
<assembly> ... <dependencySets> <dependencySet> <scope>provided</scope> <outputDirectory>lib/content-zh</outputDirectory> </dependencySet> <dependencySet> <scope>runtime</scope> <outputDirectory> webapps/${webContextName}/WEB-INF/lib </outputDirectory> <excludes> <exclude>*:zip</exclude> </excludes> </dependencySet> <dependencySet> <scope>runtime</scope> <outputDirectory> webapps/${webContextName}/resources </outputDirectory> <includes> <include>*:zip</include> </includes> <unpack>true</unpack> </dependencySet> </dependencySets> ... </assembly>
在依赖拆解的时候排除文件
<asembly> ... <dependencySets> <dependencySet> <scope>runtime</scope> <outputDirectory> webapps/${webContextName}/resources </outputDirectory> <includes> <include>*:zip</include> </includes> <unpack>true</unpack> <unpackOptions> <excludes> <exclude>**/LICENSE*</exclude> </excludes> </unpackOptions> </dependencySet> </dependencySets> ... </assembly>
使用moduleSet包含和排除模块
<assembly> ... <moduleSets> <moduleSet> <includeSubModules>false</includeSubModules> <excludes> <exclude> com.mycompany.application:secret-sauce </exclude> </excludes> <sources> <outputDirectoryMapping> ${module.basedir.name} </outputDirectoryMapping> <excludeSubModuleDirectories> false </excludeSubModuleDirectories> <fileSets> <fileSet> <directory>/</directory> <excludes> <exclude>**/target</exclude> </excludes> </fileSet> </fileSets> </sources> </moduleSet> </moduleSets> ... </assembly>
在套件中包含模块的JavaDoc
<assembly> ... <moduleSets> <moduleSet> <binaries> <attachmentClassifier>javadoc</attachmentClassifier> <includeDependencies>false</includeDependencies> <outputDirectory>apidoc-jars</outputDirectory> </binaries> </moduleSet> </moduleSets> ... </assembly>
在套件中包含模块构件和依赖
<assembly> ... <moduleSets> <moduleSet> <binaries> <outputDirectory> ${module.artifactId}-${module.version} </outputDirectory> <dependencySets> <dependencySet/> </dependencySets> </binaries> </moduleSet> </moduleSets> ... </assembly>
所有项目的内容就会被打包在一起,然后可以直接解压添加到现存web应用中(为了添加一个扩展特性)。
然而,如果你的团队构建了很多个web片段项目,那么你就会想要重用该描述符,而非复制它。
为了将该描述符以构件的形式部署,我们就要将其放到一个项目中,位于src/main/resources/assemblies目录。
|-- pom.xml
`-- src
`-- main
`-- resources
`-- assemblies
`-- web-fragment.xml
<assembly> <id>war-fragment</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <outputDirectory>WEB-INF/lib</outputDirectory> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>src/main/webapp</directory> <outputDirectory>/</outputDirectory> <excludes> <exclude>**/web.xml</exclude> </excludes> </fileSet> </fileSets> </assembly>
默认情况下,Maven会将整个src/main/resources目录打包到最终的jar中,这里,如果没有额外的配置,套件描述符也就会被打包。
相关推荐
maven学习笔记maven学习笔记maven学习笔记
三、Maven生命周期与插件 Maven的生命周期由多个阶段(如编译、测试、打包、部署等)组成,每个阶段对应一组特定的目标(goal)。开发者可以通过命令行指定执行某个阶段,或者让Maven按顺序执行整个生命周期。同时,...
### 黑马Maven笔记详解 #### Maven简介与特点 Maven是一款强大的项目管理和构建工具,作为Apache基金会下的一个开源项目,它完全采用Java语言编写,主要用于管理Java项目。Maven通过标准化项目构建过程和依赖管理...
### 黑马Maven笔记第二天知识点总结 #### Maven的核心优势 **1. 统一管理JAR包** - **节省空间**:Maven通过中央仓库管理所有项目的依赖,避免了重复下载相同JAR包的问题,有效减少了硬盘空间的占用。 - **依赖...
Maven定义了三个主要的生命周期:Clean、Default和Site。 #### Maven解决的主要痛点 - **Jar包管理难**:Maven通过中央仓库提供了一站式的jar包下载服务,开发者无需手动寻找和下载jar包,直接在`pom.xml`中声明...
Maven的生命周期包括三个主要阶段:清理(clean)、默认(default)和站点(site)。清理阶段用于删除旧的构建产物;默认阶段包括编译(compile)、测试(test)、打包(package)、验证(verify)、集成测试...
Maven的安装: (首先保证JDK版本在1.6以上) 1: 通过配置MAVEN_HOME 和 %% %MAVEN_HOME%\bin 然后进行mvn -version 测试 掌握 -Xms 与 -Xmx的相关配置 2: Maven目录分析: 2.1: bin: 含有mvn运行的脚本 2.2...
【标题】:“maven笔记:maven-overlay-实战笔记” 在 Maven 的世界里,"overlay" 是一个重要的概念,主要用于Web项目的构建和部署。Maven overlay 技术允许你将多个项目的输出“重叠”在一起,形成一个新的项目,...
** Maven详解:构建Java项目的专业工具 ** Maven是一个基于项目对象模型(Project Object Model,POM)的概念,用于管理并构建Java项目。它通过一个简单的配置文件(pom.xml),自动化项目的构建、报告和依赖管理,...
**Maven教程:基础篇——尚硅谷学习笔记 2022年** Maven是一个强大的Java项目管理和构建工具,由Apache软件基金会开发。它通过提供一个标准的项目对象模型(Project Object Model,POM)来简化项目的构建过程,并...
5. **生命周期与构建阶段**:Maven有三个基本生命周期,分别是`clean`、`default`和`site`,其中`default`生命周期包含了常见的构建阶段,如`compile`、`test`、`package`、`install`和`deploy`,它们分别对应编译源...
最新maven视频教程加源码笔记,内容完整有保证,是学习maven的不可多得的教程。
【Maven笔记】 Maven是一个强大的Java项目管理工具,它主要解决了在软件开发过程中遇到的一系列问题,如依赖管理、项目构建以及环境一致性等。通过使用Maven,开发者可以更高效地管理和构建Java项目,避免手动复制...
** Maven 概述 ** Maven 是一个强大的项目管理和构建工具,主要应用于Java项目。它通过提供一套标准化的构建过程,使得项目的...通过学习Maven笔记,开发者可以更好地掌握这一强大的工具,提升项目开发的专业水平。
《Maven开发者笔记》是一本面向Java开发者的实用指南,旨在帮助读者深入理解和掌握Maven这一强大的构建工具。Maven不仅简化了项目的构建过程,还提供了项目管理的标准化方法,使得依赖管理和构建流程变得规范而高效...
** Maven高级技术详解 ** Maven,作为Java项目管理和构建工具,因其强大的自动化构建功能而备受开发者喜爱。本文将深入探讨Maven的高级特性,包括多模块开发、继承与聚合,以及私有仓库(私服)的操作,这些都是在...
Maven 是 Java 项目中一种流行的构建工具,能够帮助开发者更好地管理项目依赖关系、编译、打包和发布。下面是 Maven 的一些知识点: 1. Maven 的必要性:Maven 之所以需要,是因为在没有 Maven 之前,开发者需要...