很多笔记及实例摘录自《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中,这里,如果没有额外的配置,套件描述符也就会被打包。