POM文件
POM, Project Object Model, 项目对象模型,是Maven项目的XML表示,一个pom.xml文件可以几乎完成所有maven项目的配置。POM标签分为三大类,项目基础及依赖、项目构建、环境及资源文件。这三大类是比较普遍和重要的配置归类,除这三大类之外还有一些辅助配置,项目中接触的较少。
按照顺序把三大类的配置完成了, 一个Maven项目大致上就能配置得很全面了。
Basics: 项目基础及依赖
每一个Maven项目都有一个独一无二的坐标,由三个标签组成,分别是<groupId>、<artifactId>、<version>,比如:
<groupId>cn.jim</groupId>
<artifactId>Netbar</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>NetBar</name>
<description>Netbar project</description>
这三个标签最终组成cn.jim.Netbar:1.0.0-SNAPSHOT。
<groupId>项目组或者开发团队,或者软件组, 一个groupId可以被多个artifact共享。
<artifactId>项目Id,每一个artifactId在groupId内是唯一的。
<version>版本号,有些项目除了version以外还需要借助<classifier>、<scope>等标签来定位。
<name>标签不是给机器看的,是给人看的,便于阅读。
<description>标签同理,有的人看了<name>还不是太懂,帮助阅读的。
<packaging>标签,指定了maven项目最终打包的文件类型,如果不定义这个标签,默认就是jar。可以选择的标签值有:jar, war, pom, maven-plugin, ejb, ear, rat .
以上这些标签定义的是项目基础
Maven的核心三大功能就是依赖、继承和聚合。<dependency>标签就是用于Maven依赖功能的配置,通过<dependency>配置的依赖,Maven会自动从本地或远程仓库找到对应的版本并且安装到打包的项目中,不用人工到处找jar包了。
<dependencies>
<!-- netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.42.Final</version>
</dependency>
<!-- netty end -->
<!-- spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
</dependencies>
在多个依赖之间,有时候会发生jar包冲突的情况,不同的依赖引用了同一个jar包,但是引用的版本不同,Maven在打包时不知道使用哪一个版本,所以产生了报错。在这种情况下可以使用<exclusion>标签来排除指定的jar包。
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
...
</dependencies>
Build:项目构建
<build>标签下配置的是与项目构建相关的。
1. 基础配置
以下标签应该在<build>标签的范围内,属于<build>基础配置:
<defaultGoal> 默认执行的打包指令,比如install, package等
<directory> 打包文件的生成目录,默认为${basedir}/target
<finalName> 打包生成的文件名称,默认是${artifactId}-${version}
<filters> *.properties属性配置文件的存放地址,Maven默认的地址是${basedir}/src/main/filters/
<sourceDirectory> ,<scriptSourceDirectory>,<testSourceDirectory>,<outPutDirectory>,<testOutputDirectory>
*Directory的地址,使用默认的就好。
以上标签配置举例:
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
</build>
事实上这些标签都有默认配置,了解其意义就好,有特殊需求时才需要显示配置。
2. <resources>标签
配置资源文件,资源文件不是源代码,一般不需要编译。
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.**</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
以上示例resources的目录是src/main/resources(实际上也是默认的resources目录),可以使用include指定要加载的资源文件,同理也可以使用exclude标签,include和exclude同时对同一个文件使用时,只有exclude生效。<filtering>为true时可以使用.properties中的键值对来替换Pom文件中的${}值。
3. <plugins>标签
<plugin>定义maven构建过程中使用的插件。
maven在构建过程中需要使用插件,有几个常用的插件,是maven自带的
maven-resources-plugin 处理源资源文件和测试资源文件 resources,testResources
maven-compiler-plugin 编译源文件和测试源文件 compile,testCompile
maven-surefire-plugin 执行测试文件 test
maven-jar-plugin 创建 jar jar
maven-war-plugin 创建war
maven自带的插件有默认版本,如果不是有特殊需要,不需要显示定义和配置。此外如果还需要maven以外的插件,则需要在<build>标签范围内配置。
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>...</dependencies>
<executions>...</executions>
</plugin>
</plugins>
</build>
环境配置
此类下有几个重要的标签。
1. <repositories>
<repositories>
<repository>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<id>codehausSnapshots</id>
<name>Codehaus Snapshots</name>
<url>http://snapshots.maven.codehaus.org/maven2</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
...
</pluginRepositories>
...
</project>
maven构建时搜索依赖库的顺序是:1. 本地代码仓 2. 远程代码仓 3.maven中央仓。 <repositories>可以配置远程代码仓。<snapshots>和<releases>分别配置的是测试版本和发布版本,如果<enabled>为true,就可以该repository里搜索并安装jar版本,反之不可以。<updataPolicy>是远程代码库到本地的更新频率,有四个级别always, daily (default), interval:X (where X is an integer in minutes) , never.
2. <distrubutionManagement>
发布配置,maven deploy指令,可以发布jar包到配置的地址仓库。如果不单独配置<snapshotRepository>,测试版本也会默认使用<repository>中的配置。
<distributionManagement>
<repository>
<uniqueVersion>false</uniqueVersion>
<id>corp1</id>
<name>Corporate Repository</name>
<url>scp://repo/maven2</url>
<layout>default</layout>
</repository>
<snapshotRepository>
<uniqueVersion>true</uniqueVersion>
<id>propSnap</id>
<name>Propellors Snapshots</name>
<url>sftp://propellers.net/maven</url>
<layout>legacy</layout>
</snapshotRepository>
...
</distributionManagement>
...
</project>
3. <profiles>
我们希望在不同的机器、服务器上使用不同的构建配置,可以通过profiles来实现。
<profiles>
<profile>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<id>dev</id>
<build>
<resources>
<resource>
<directory>src/main/profiles/dev</directory>
<includes>
<include>dataSource.xml</include>
<include>logback.xml</include>
<include>system.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
<profile>
<id>prod</id>
<build>
<resources>
<resource>
<directory>src/main/profiles/prod</directory>
<includes>
<include>dataSource.xml</include>
<include>logback.xml</include>
<include>system.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
</profiles>
开发和生产通过不同的profile可以使用不同的<build>配置,这些<build>配置是基于profile的,和之前的基本配置不冲突。
总结
完成一个POM的配置:
1. 基础配置<groupId><artifactId><version>等。
2. 依赖配置<dependencies><dependency>。
3. <build>标签构建基础配置(可默认)。
4. <build>标签resource配置。
5. <build>标签plugin配置。
6. <repositories>版本仓库配置。
7. <distributionManagement>版本发布配置。
8. <profiles>配置