2019独角兽企业重金招聘Python工程师标准>>>
Maven概念
参考maven入门 冰河winner
Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。 Maven不仅是构建工具,还是一个依赖管理工具和项目管理工具,它提供了中央仓库,能帮我自动下载构件
- bin目录: 该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。
- boot目录: 该目录只包含一个文件,该文件为plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。
- conf目录: 该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven的行为,一般情况下,我们更偏向于复制该文件至~/.m2/目录下(~表示用户目录),然后修改该文件,在用户范围定制Maven的行为。
- lib目录: 该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。
maven 安装(linux)(windows下不介绍了)
apache-maven-3.0.5-bin.zip
unzip apache-maven-3.0.5-bin.zip
mv apache-maven-3.0.5 /opt/modules/vi /etc/profile
export MAVEN_HOME=/opt/modules/apache-maven-3.0.5
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
mvn -verison
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 08:51:28-0500)
Maven home: /opt/modules/apache-maven-3.0.5
Java version: 1.7.0_67, vendor: Oracle Corporation
Java home: /opt/modules/jdk1.7.0_67/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-358.el6.x86_64", arch: "amd64", family: "unix"
cd /opt/modules/apache-maven-3.0.5/conf/
vi settings.xml
<!--指定本地仓库的地址 -->
<localRepository>/opt/modules/apache-maven-3.0.5-localRepository</localRepository>
Maven常用命令说明
mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
mvn clean test:运行清理和测试。
mvn clean package:运行清理和打包。
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)。
Maven使用
<?xml version='1.0' encoding='utf-8' ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><artifactId>TBDAP-MAIN</artifactId><packaging>war</packaging><name>jianxin</name><parent><groupId>com.jianxin</groupId><artifactId>TBDAP-PARENT</artifactId><version>0.0.2-SNAPSHOT</version><relativePath>../TBDAP-PARENT/pom.xml</relativePath></parent><dependencies><dependency><groupId>com.jianxin</groupId><artifactId>TBDAP-MANAGER</artifactId><version>${tbdap.version}</version><type>war</type></dependency><dependency><groupId>com.jianxin</groupId><artifactId>TBDAP_HOTEL</artifactId><version>${tbdap.version}</version><type>war</type></dependency></dependencies><build><finalName>tbdap</finalName><plugins><!-- 合并多个war --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><warSourceExcludes>WEB-INF/lib/spring-web-4.1.0.RELEASE.jar</warSourceExcludes><failOnMissingWebXml>false</failOnMissingWebXml><overlays><!-- 权限管理放在最前面 --><overlay><groupId>com.jianxin</groupId><artifactId>TBDAP-MANAGER</artifactId></overlay><!-- 权限管理放在最前面 --></overlays></configuration></plugin></plugins></build>
</project>
project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素。 根元素下的第一个子元素modelVersion指定了当前的POM模型的版本,对于Maven3来说,它只能是4.0.0 代码中最重要是包含了groupId,artifactId和version了。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者jar都是以基于这些基本的坐标进行区分的。
groupId定义了项目属于哪个组,随意命名,比如谷歌公司的myapp项目,就取名为 com.google.myapp
artifactId定义了当前Maven项目在组中唯一的ID,比如定义hello-world。
version指定了项目当前的版本0.0.1-SNAPSHOT,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的。
name元素生命了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name。
依赖的配置
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:
- grounpId、artifactId和version:以来的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
- type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
- scope:依赖的范围
- optional:标记依赖是否可选
- exclusions:用来排除传递性依赖
可选的依赖
当不可能把一个项目分裂成子模块(不管什么原因)的时候,我们可以使用可选的依赖。它的思想就是:在项目中一些依赖仅仅被某些功能使用,并且如果这个功能不被使用,这个依赖就不需要。理想情况下,根据核心的功能性项目,一个功能被分成子模块… 如果你决定使用子模块的功能,因为你必须需要他们的全部,所以新的子项目仅仅有不可选的依赖。 然而,因为这个项目不可能被分成子模块,所以这些依赖被声明成可选的。如果一个用户想要使用和一个可选的依赖相关的功能,他们将不得不在他们自己的项目中重新声明可选的依赖。用这种方法处理这种情况不是的最好的方式,但是可选的依赖和依赖排除也是一个权宜的解决办法。
- 选的依赖工作原理
如图,项目中A依赖B,B依赖于X和Y,如果所有这三个的范围都是compile的话,那么X和Y就是A的compile范围的传递性依赖,但是如果我想X,Y不作为A的传递性依赖,不给他用的话。就需要下面提到的配置可选依赖。
依赖范围
依赖范围就是用来控制依赖和三种classpath(编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:
- compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖。(项目上一般用这种依赖)
- test: 测试依赖范围。使用次依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要。
- provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时候无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器以及提供,就不需要Maven重复地引入一遍。
- runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
- system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致,但是,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能构成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量,如:
排除依赖
有时候你引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到排除依赖了,比如下图中spring-boot-starter-web自带了logback这个日志包,我想引入log4j2的,所以我先排除掉logback的依赖包,再引入想要的包就行了.
这里注意:声明exclustion的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。
归类依赖
有时候我们引入的很多依赖包,他们都来自同一个项目的不同模块,所以他们的版本号都一样,这时候我们可以用属性来统一管理版本号
<dependency><groupId>com.jianxin</groupId><artifactId>rtf</artifactId><version>${jianxin.version}</version>
</dependency>
<dependency><groupId>com.jianxin</groupId><artifactId>jianxin-utils</artifactId><version>${jianxin.version}</version>
</dependency>
<properties><jianxin.version>0.0.1</jianxin.version><jianxin.version>0.0.1</jianxin.version>
</properties>
maven 仓库
- 本地仓库 maven加压包中conf下的setting.mxl中配置(windows下)
<localRepository>D:/apache-maven-3.3.3/download</localRepository>
-
远程仓库-中央仓库
由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。
中央仓库包含了这个世界上绝大多数流行的开源Java构件,以及源码、作者信息、SCM,信息、许可证信息等,每个月这里都会接受全世界Java程序员大概1亿次的访问,它对全世界Java开发者的贡献由此可见一斑。 -
远程仓库-私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。因此,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。 私服的好处:- 节省自己的外网速度
- 加速Maven构建
- 部署第三方构建
- 提高稳定性,增强控制
- 降低中央仓库的负荷
看一下项目上的配置文件
<?xml version="1.0" encoding="UTF-8"?><!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
--><!--| This is the configuration file for Maven. It can be specified at two levels:|| 1. User Level. This settings.xml file provides configuration for a single user, | and is normally provided in ${user.home}/.m2/settings.xml.|| NOTE: This location can be overridden with the CLI option:|| -s /path/to/user/settings.xml|| 2. Global Level. This settings.xml file provides configuration for all Maven| users on a machine (assuming they're all using the same Maven| installation). It's normally provided in | ${maven.home}/conf/settings.xml.|| NOTE: This location can be overridden with the CLI option:|| -gs /path/to/global/settings.xml|| The sections in this sample file are intended to give you a running start at| getting the most out of your Maven installation. Where appropriate, the default| values (values used when the setting is not specified) are provided.||-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><!-- localRepository| The path to the local repository maven will use to store artifacts.|| Default: ${user.home}/.m2/repository<localRepository>/path/to/local/repo</localRepository>--><!-- 配置maven本地仓库 --><localRepository>D:/apache-maven-3.3.3/download</localRepository><!-- interactiveMode| This will determine whether maven prompts you when it needs input. If set to false,| maven will use a sensible default value, perhaps based on some other setting, for| the parameter in question.|| Default: true<interactiveMode>true</interactiveMode>--><!-- offline| Determines whether maven should attempt to connect to the network when executing a build.| This will have an effect on artifact downloads, artifact deployment, and others.|| Default: false<offline>false</offline>--><!-- pluginGroups| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.|--><pluginGroups><!-- pluginGroup| Specifies a further group identifier to use for plugin lookup.<pluginGroup>com.your.plugins</pluginGroup>--></pluginGroups><!-- proxies| This is a list of proxies which can be used on this machine to connect to the network.| Unless otherwise specified (by system property or command-line switch), the first proxy| specification in this list marked as active will be used.|--><!-- 配置maven代理 --><proxies><!-- proxy| Specification for one proxy, to be used in connecting to the network.|<proxy><id>optional</id><active>true</active><protocol>http</protocol><username>proxyuser</username><password>proxypass</password><host>proxy.host.net</host><port>80</port><nonProxyHosts>local.net|some.host.com</nonProxyHosts></proxy>--></proxies><!-- servers| This is a list of authentication profiles, keyed by the server-id used within the system.| Authentication profiles can be used whenever maven must make a connection to a remote server.|--><servers><!-- server| Specifies the authentication information to use when connecting to a particular server, identified by| a unique name within the system (referred to by the 'id' attribute below).| | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are | used together.|<server><id>deploymentRepo</id><username>repouser</username><password>repopwd</password></server>--><!-- Another sample, using keys to authenticate.<server><id>siteServer</id><privateKey>/path/to/private/key</privateKey><passphrase>optional; leave empty if not used.</passphrase></server>--><!-- 远程仓库的认证,大部分的远程仓库不需要认证,但是如果是自己内部使用,为了安全起见,还是要配置认证信息的。
配置认证信息和配置远程仓库不同,远程仓库可以直接在pom.xml中配置,但是认证信息必须配置在settings.xml文件中。这是因为pom往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只存在于本机。因此,在settings.xml中配置认证信息更为安全。 --><server><id>nexus-releases</id><username>admin</username><password>jianxin2016!@#$%</password></server><server> <id>nexus-snapshots</id><username>admin</username><password>jianxin2016!@#$%</password></server></servers><!-- mirrors| This is a list of mirrors to be used in downloading artifacts from remote repositories.| | It works like this: a POM may declare a repository to use in resolving certain artifacts.| However, this repository may have problems with heavy traffic at times, so people have mirrored| it to several places.|| That repository definition will have a unique id, so we can create a mirror reference for that| repository, to be used as an alternate download site. The mirror site will be the preferred | server for that repository.|--><!-- 配置镜像 --><mirrors><!-- mirror| Specifies a repository mirror site to use instead of a given repository. The repository that| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.|<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--></mirrors><!-- profiles| This is a list of profiles which can be activated in a variety of ways, and which can modify| the build process. Profiles provided in the settings.xml are intended to provide local machine-| specific paths and repository locations which allow the build to work in the local environment.|| For example, if you have an integration testing plugin - like cactus - that needs to know where| your Tomcat instance is installed, you can provide a variable here such that the variable is | dereferenced during the build process to configure the cactus plugin.|| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles| section of this document (settings.xml) - will be discussed later. Another way essentially| relies on the detection of a system property, either matching a particular value for the property,| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.| Finally, the list of active profiles can be specified directly from the command line.|| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact| repositories, plugin repositories, and free-form properties to be used as configuration| variables for plugins in the POM.||--><profiles><!-- 远程仓库的设置 --><!-- -repository:在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
- id:仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库声明也使用该id,就会覆盖中央仓库的配置。
- name:仓库的名称,让我们直观方便的知道仓库是哪个,暂时没发现其他太大的含义。
- url:指向了仓库的地址,一般来说,该地址都基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件。
- releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。需要注意的是enabled子元素,该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。根据该配置,Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
- layout:元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。基本不会用到Maven1的布局。
- 其他:对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy。
1:元素updatePolicy用来配置Maven从远处仓库检查更新的频率,默认值是daily,表示Maven每天检查一次。其他可用的值包括:never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。
2:元素checksumPolicy用来配置Maven检查校验和文件的策略。当构建被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。 --><profile><id>nexusProfile</id><repositories><repository><id>nexus</id><name>Repository</name><!-- ip地址已经随便更改 --><url>http://172.51.123.121:9037/nexus/content/groups/public/</url><layout>default</layout><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>nexus</id><name>local private nexus</name><url>http://172.51.123.121:9037/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></profile><profile> <id>jdk17</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.7</jdk> </activation> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion> </properties> </profile> </profiles><!-- activeProfiles| List of profiles that are active for all builds.|--><activeProfiles><activeProfile>nexusProfile</activeProfile></activeProfiles></settings>
基础配置
一个典型的pom.xml文件配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 --><modelVersion>4.0.0</modelVersion><!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade --><groupId>com.winner.trade</groupId><!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --><artifactId>trade-core</artifactId><!-- 本项目目前所处的版本号 --><version>1.0.0-SNAPSHOT</version><!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar --><packaging>jar</packaging><!-- 帮助定义构件输出的一些附属构件,附属构件与主构件对应,有时候需要加上classifier才能唯一的确定该构件 不能直接定义项目的classifer,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的 --><classifier>...</classifier><!-- 定义本项目的依赖关系 --><dependencies><!-- 每个dependency都对应这一个jar包 --><dependency><!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),--> <!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 --><groupId>com.winner.trade</groupId><artifactId>trade-test</artifactId><version>1.0.0-SNAPSHOT</version><!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 --><!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) --><scope>test</scope><!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 --><optional>false</optional><!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 --><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions></dependency></dependencies><!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} --><properties><file.encoding>UTF-8</file.encoding><java.source.version>1.5</java.source.version><java.target.version>1.5</java.target.version></properties>...
</project>
一般来说,上面的几个配置项对任何项目都是必不可少的,定义了项目的基本属性。
这里有必要对一个不太常用的属性classifier做一下解释,因为有时候引用某个jar包,classifier不写的话会报错。
classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码) 这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。
classifier的用途在于:
-
maven download javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件
-
引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套: 引用它的时候就要注明JDK版本,否则maven不知道你到底需要哪一套jar包:
<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier>
</dependency>
构建配置(非常重要,解决了项目上MyBatis mapper文件不能扫描打包的问题)
pom.xml中配置如下
<build><!-- 产生的构件的文件名,默认值是${artifactId}-${version}。 --><finalName>myPorjectName</finalName><!-- 构建产生的所有文件存放的目录,默认为${basedir}/target,即项目根目录下的target --><directory>${basedir}/target</directory><!--当项目没有规定目标(Maven2叫做阶段(phase))时的默认值, --><!--必须跟命令行上的参数相同例如jar:jar,或者与某个阶段(phase)相同例如install、compile等 --><defaultGoal>install</defaultGoal><!--当filtering开关打开时,使用到的过滤器属性文件列表。 --><!--项目配置信息中诸如${spring.version}之类的占位符会被属性文件中的实际值替换掉 --><filters><filter>../filter.properties</filter></filters><!--项目相关的所有资源路径列表,例如和项目相关的配置文件、属性文件,这些资源被包含在最终的打包文件里。 --><resources><resource><!--描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。 --><!--举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven/messages。 --><!--然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 --><targetPath>resources</targetPath><!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 --><filtering>true</filtering><!--描述存放资源的目录,该路径相对POM路径 --><directory>src/main/resources</directory><!--包含的模式列表 --><includes><include>**/*.properties</include><include>**/*.xml</include></includes><!--排除的模式列表 如果<include>与<exclude>划定的范围存在冲突,以<exclude>为准 --><excludes><exclude>jdbc.properties</exclude></excludes></resource></resources><!--单元测试相关的所有资源路径,配制方法与resources类似 --><testResources><testResource><targetPath /><filtering /><directory /><includes /><excludes /></testResource></testResources><!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --><sourceDirectory>${basedir}\src\main\java</sourceDirectory><!--项目脚本源码目录,该目录和源码目录不同, <!-- 绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 --><scriptSourceDirectory>${basedir}\src\main\scripts</scriptSourceDirectory><!--项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --><testSourceDirectory>${basedir}\src\test\java</testSourceDirectory><!--被编译过的应用程序class文件存放的目录。 --><outputDirectory>${basedir}\target\classes</outputDirectory><!--被编译过的测试class文件存放的目录。 --><testOutputDirectory>${basedir}\target\test-classes</testOutputDirectory><!--项目的一系列构建扩展,它们是一系列build过程中要使用的产品,会包含在running bulid‘s classpath里面。 --><!--他们可以开启extensions,也可以通过提供条件来激活plugins。 --><!--简单来讲,extensions是在build过程被激活的产品 --><extensions><!--例如,通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、 --><!--将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。 --><!--实际上这些步骤都可以通过Maven的一个插件 wagon-maven-plugin 来自动完成 --><!--下面的扩展插件wagon-ssh用于通过SSH的方式连接远程服务器, --><!--类似的还有支持ftp方式的wagon-ftp插件 --><extension><groupId>org.apache.maven.wagon</groupId><artifactId>wagon-ssh</artifactId><version>2.8</version></extension></extensions><!--使用的插件列表 。 --><plugins><plugin><groupId></groupId><artifactId>maven-assembly-plugin</artifactId><version>2.5.5</version><!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 --><executions><execution><!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 --><id>assembly</id><!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 --><phase>package</phase><!--配置的执行目标 --><goals><goal>single</goal></goals><!--配置是否被传播到子POM --><inherited>false</inherited></execution></executions><!--作为DOM对象的配置,配置项因插件而异 --><configuration><finalName>${finalName}</finalName><appendAssemblyId>false</appendAssemblyId><descriptor>assembly.xml</descriptor></configuration><!--是否从该插件下载Maven扩展(例如打包和类型处理器), --><!--由于性能原因,只有在真需要下载时,该元素才被设置成true。 --><extensions>false</extensions><!--项目引入插件所需要的额外依赖 --><dependencies><dependency>...</dependency></dependencies><!--任何配置是否被传播到子项目 --><inherited>true</inherited></plugin></plugins><!--主要定义插件的共同元素、扩展元素集合,类似于dependencyManagement, --><!--所有继承于此项目的子项目都能使用。该插件配置项直到被引用时才会被解析或绑定到生命周期。 --><!--给定插件的任何本地配置都会覆盖这里的配置 --><pluginManagement><plugins>...</plugins></pluginManagement></build>
项目上的一个构建
<build><finalName>TBDAP-MANAGER</finalName><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><plugins><!-- 合并多个war --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><configuration><warSourceExcludes>WEB-INF/lib/spring-web-4.1.0.RELEASE.jar</warSourceExcludes><failOnMissingWebXml>false</failOnMissingWebXml><overlays><!-- 权限管理放在最前面 --><overlay><groupId>com.inspur</groupId><artifactId>TBDAP-MANAGER</artifactId></overlay><!-- 权限管理放在最前面 --></overlays></configuration></plugin></plugins></build>
设置http代理
编辑conf/seeting.xml文件 有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网。这种情况下,就需要为Maven配置HTTP代理,才能让它正常访问外部仓库,以下载所需要的资源。首先确认自己无法直接访问公共的maven中央仓库,直接运行命令ping repo1.maven.org可以检查网络。如果真的需要代理,先检查一下代理服务器是否畅通。比如现在有一个IP地址为218.14.227.197,端口为3128的代理服务,我们可以运行telnet 218.14.227.197 3128来检测该地址的该端口是否畅通。
username,password,nonProxyHosts几个元素。当代理服务需要认证时,就需要配置username和password。nonProxyHost元素用来指定哪些主机不需要代理,可以使用"|"符号来分隔多个主机名。此外,该配置也支持通配符,如:*.google.com表示所有以google.com结尾的域名访问都不要通过代理。
部署构件至远程仓库
我们自己搭建远程仓库的目的就是为了可以方便部署我们自己项目的构件以及一些无法从外部仓库直接获取的构件。这样才能在开发时,供其他对团队成员使用。 Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构件部署到远程仓库中。首先,需要编辑项目的pom.xml文件。配置distributionManagement元素,代码如下:
<!--项目分发信息,在执行mvn deploy后表示要发布的位置。 -->
<!--有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->
<distributionManagement><!--部署项目产生的构件到远程仓库需要的信息 --><repository><!--是分配给快照一个唯一的版本号(由时间戳和构建流水号),还是每次都使用相同的版本号 --><!--参见repositories/repository元素 --><uniqueVersion>true</uniqueVersion><id> repo-id </id><name> repo-name</name><url>file://${basedir}/target/deploy </url><layout /></repository><!--构件的快照部署到哪里,如果没有配置该元素,默认部署到repository元素配置的仓库 --><snapshotRepository><uniqueVersion /><id /><name /><url /><layout /></snapshotRepository><!--部署项目的网站需要的信息 --><site><!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 --><id> site-id </id><!--部署位置的名称 --><name> site-name</name><!--部署位置的URL,按protocol://hostname/path形式 --><url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url></site><!--项目下载页面的URL。如果没有该元素,用户应该参考主页。 --><!--使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 --><downloadUrl /><!--如果构件有了新的groupID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 --><relocation><!--构件新的group ID --><groupId /><!--构件新的artifact ID --><artifactId /><!--构件新的版本号 --><version /><!--显示给用户的,关于移动的额外信息,例如原因。 --><message /></relocation><!--给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。 --><!--有效的值有:none(默认),converted(仓库管理员从Maven 1 POM转换过来), --><!--partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的)。 --><status /></distributionManagement>
分发配置
<!--项目分发信息,在执行mvn deploy后表示要发布的位置。 -->
<!--有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->
<distributionManagement><!--部署项目产生的构件到远程仓库需要的信息 --><repository><!--是分配给快照一个唯一的版本号(由时间戳和构建流水号),还是每次都使用相同的版本号 --><!--参见repositories/repository元素 --><uniqueVersion>true</uniqueVersion><id> repo-id </id><name> repo-name</name><url>file://${basedir}/target/deploy </url><layout /></repository><!--构件的快照部署到哪里,如果没有配置该元素,默认部署到repository元素配置的仓库 --><snapshotRepository><uniqueVersion /><id /><name /><url /><layout /></snapshotRepository><!--部署项目的网站需要的信息 --><site><!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 --><id> site-id </id><!--部署位置的名称 --><name> site-name</name><!--部署位置的URL,按protocol://hostname/path形式 --><url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url></site><!--项目下载页面的URL。如果没有该元素,用户应该参考主页。 --><!--使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 --><downloadUrl /><!--如果构件有了新的groupID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 --><relocation><!--构件新的group ID --><groupId /><!--构件新的artifact ID --><artifactId /><!--构件新的版本号 --><version /><!--显示给用户的,关于移动的额外信息,例如原因。 --><message /></relocation><!--给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。 --><!--有效的值有:none(默认),converted(仓库管理员从Maven 1 POM转换过来), --><!--partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的)。 --><status /></distributionManagement>
仓库配置
<!--发现依赖和扩展的远程仓库列表。 -->
<repositories><!--包含需要连接到远程仓库的信息 --><repository><!--如何处理远程仓库里发布版本的下载 --><releases><!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 --><enabled /><!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。 --><!--这里的选项是:always(一直),daily(默认,每日), --><!--interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 --><updatePolicy /><!--当Maven验证构件校验文件失败时该怎么做: --><!--ignore(忽略),fail(失败),或者warn(警告)。 --><checksumPolicy /></releases><!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置, --><!--POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。 --><!--例如,可能有人会决定只为开发目的开启对快照版本下载的支持 --><snapshots><enabled /><updatePolicy /><checksumPolicy /></snapshots><!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 --><id> repo-id </id><!--远程仓库名称 --><name> repo-name</name><!--远程仓库URL,按protocol://hostname/path形式 --><url>http://192.168.1.169:9999/repository/ </url><!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。 --><!--Maven 2为其仓库提供了一个默认的布局; --><!--然而,Maven1.x有一种不同的布局。 --><!--我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 --><layout> default</layout></repository></repositories><!--发现插件的远程仓库列表,这些插件用于构建和报表 -->
<pluginRepositories><!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 --><pluginRepository /></pluginRepositories>
profile配置
<!--在列的项目构建profile,如果被激活,会修改构建处理 -->
<profiles><!--根据环境参数或命令行参数激活某个构建处理 --><profile><!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。 --><activation><!--profile默认是否激活的标识 --><activeByDefault>false</activeByDefault><!--activation有一个内建的java版本检测,如果检测到jdk版本与期待的一样,profile被激活。 --><jdk>1.7</jdk><!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 --><os><!--激活profile的操作系统的名字 --><name>Windows XP</name><!--激活profile的操作系统所属家族(如 'windows') --><family>Windows</family><!--激活profile的操作系统体系结构 --><arch>x86</arch><!--激活profile的操作系统版本 --><version>5.1.2600</version></os><!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。 --><!-- 如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 --><property><!--激活profile的属性的名称 --><name>mavenVersion</name><!--激活profile的属性的值 --><value>2.0.3</value></property><!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。 --><!--另一方面,exists则会检查文件是否存在,如果存在则激活profile。 --><file><!--如果指定的文件存在,则激活profile。 --><exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists><!--如果指定的文件不存在,则激活profile。 --><missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing></file></activation><id /><build /><modules /><repositories /><pluginRepositories /><dependencies /><reporting /><dependencyManagement /><distributionManagement /><properties /></profile>
项目信息配置
<!--项目的名称, Maven产生的文档用 -->
<name>banseon-maven </name><!--项目主页的URL, Maven产生的文档用 -->
<url>http://www.clf.com/ </url><!--项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时 -->
<!--(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标签),不鼓励使用纯文本描述。 -->
<!-- 如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。 -->
<description>A maven project to study maven. </description><!--描述了这个项目构建环境中的前提条件。 -->
<prerequisites><!--构建该项目或使用该插件所需要的Maven的最低版本 --><maven /></prerequisites><!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->
<inceptionYear /><!--项目相关邮件列表信息 -->
<mailingLists><!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 --><mailingList><!--邮件的名称 --><name> Demo </name><!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 --><post> clf@126.com</post><!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 --><subscribe> clf@126.com</subscribe><!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 --><unsubscribe> clf@126.com</unsubscribe><!--你可以浏览邮件信息的URL --><archive> http:/hi.clf.com/</archive></mailingList></mailingLists><!--项目开发者列表 -->
<developers><!--某个项目开发者的信息 --><developer><!--SCM里项目开发者的唯一标识符 --><id> HELLO WORLD </id><!--项目开发者的全名 --><name> banseon </name><!--项目开发者的email --><email> banseon@126.com</email><!--项目开发者的主页的URL --><url /><!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 --><roles><role> Project Manager</role><role>Architect </role></roles><!--项目开发者所属组织 --><organization> demo</organization><!--项目开发者所属组织的URL --><organizationUrl>http://hi.clf.com/ </organizationUrl><!--项目开发者属性,如即时消息如何处理等 --><properties><dept> No </dept></properties><!--项目开发者所在时区, -11到12范围内的整数。 --><timezone> -5</timezone></developer></developers><!--项目的其他贡献者列表 -->
<contributors><!--项目的其他贡献者。参见developers/developer元素 --><contributor><name /><email /><url /><organization /><organizationUrl /><roles /><timezone /><properties /></contributor></contributors><!--该元素描述了项目所有License列表。应该只列出该项目的license列表,不要列出依赖项目的license列表。 -->
<!--如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 -->
<licenses><!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 --><license><!--license用于法律上的名称 --><name> Apache 2 </name><!--官方的license正文页面的URL --><url>http://www.clf.com/LICENSE-2.0.txt </url><!--项目分发的主要方式: repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖 --><distribution> repo</distribution><!--关于license的补充信息 --><comments> Abusiness-friendly OSS license </comments></license></licenses><!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->
<scm><!--SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和列表。该连接只读。 --><connection>scm:svn:http://svn.baidu.com/banseon/maven/</connection><!--给开发者使用的,类似connection元素。即该连接不仅仅只读 --><developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/</developerConnection><!--当前代码的标签,在开发阶段默认为HEAD --><tag /><!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 --><url> http://svn.baidu.com/banseon</url></scm><!--描述项目所属组织的各种属性。Maven产生的文档用 -->
<organization><!--组织的全名 --><name> demo </name><!--组织主页的URL --><url> http://www.clf.com/</url></organization>
环境配置
<!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira -->
<issueManagement><!--问题管理系统(例如jira)的名字, --><system> jira </system><!--该项目使用的问题管理系统的URL --><url> http://jira.clf.com/</url></issueManagement><!--项目持续集成信息 -->
<ciManagement><!--持续集成系统的名字,例如continuum --><system /><!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 --><url /><!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) --><notifiers><!--配置一种方式,当构建中断时,以该方式通知用户/开发者 --><notifier><!--传送通知的途径 --><type /><!--发生错误时是否通知 --><sendOnError /><!--构建失败时是否通知 --><sendOnFailure /><!--构建成功时是否通知 --><sendOnSuccess /><!--发生警告时是否通知 --><sendOnWarning /><!--不赞成使用。通知发送到哪里 --><address /><!--扩展配置项 --><configuration /></notifier></notifiers></ciManagement>