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

1683

被折叠的 条评论
为什么被折叠?



