参考
maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程
maven内置属性(${} properties)
maven eclipse基本知识
Maven 教程(21)— maven-compiler-plugin 插件详解
Maven 学习
官网
Maven是一个用于项目构建的工具,通过它便捷的管理项目的生命周期。即项目的jar包依赖,开发,测试,发布打包。
Maven 哲学 (Maven 开发者的)大概翻译(参考):
Maven 被大部分人认为只是一个编译工具。许多人最初是从熟悉ant而转到maven的,因此很自然地这样认为maven是一个构建工具。但是maven并不仅仅是一个构建工具,也不是ant的一个替代工具。maven是一个完全不同于ant的产物。ant只是一个简单的工具箱而maven是模式的应用程序,这些模式完成一个框架,它有可视化、重用性、可维护性、扩展性等特点。
没有这些特征,多人高效的工作在一个项目上是不可能的。没有可视化,个人难以知道其它人完成了什么,有用的代码可能无法重用。当代码无法重用时,可维护的系统是很难被创建的。当每个人都在试图弄明白组成项目的所有点点滴滴是什么的时候,很少有人能够从整体去理解这个项目。随着团队成员之间失落情绪达到一定的程度,共享知识会逐渐衰退,最终以粮仓效应结束。当过程不能以相同方式进行时,这是一种自然的结果。
Maven诞生在apache项目非常渴望以统一的方式进行时。因此开发者能够很容易在项目间移动,只需要明白其中一个项目是如何工作的,就能够理解其它项目是如何工作的。如果一个开发人员花时间理解了一个项目是如何构建的,当他进行下一个项目时,他不必再经历这一过程。相同的想法可以扩展到测试,文档生成,报告生成,部署。所有项目共享相同的特征,maven试图在项目管理中固定它的常用方法。所有项目都需要构建,测试,打包,文档化,部署。当然,在上面的每一个步骤中都有无尽的变化,但是这些变化发生在预定路径的范围内,maven试图以清晰的方式展现给每一个人。使路径清晰最简单的方式就是提供一系列模式给参与项目的每一个人共享。
安装
环境准备
- java开发环境(JDK)
- 下载:http://maven.apache.org/release-notes-all.html
安装
- 下载 Maven ,其实就是一个压缩包,解压一下
配置环境变量
有两个环境变量可以配置:
MAVEN_HOME = D:\maven\apache-maven-3.2.3
MAVEN_OPTS = -Xms128m -Xmx512m(可选,如果想让 Maven 跑得更快点,可以根据自己的情况来设置 MAVEN_OPTS)在path变量末尾加入“%MAVEN_HOME%\bin;
- 验证是否安装成功
打开cmd,输入mvn -v,看到mvn信息表示安装成功。
配置本地Repository
默认地址位于 C:\Users\用户名.m2 目录下(对于专业人士来说C盘很危险,所以可以修改这个默认地址到其他磁盘)。
修改文件:D:\software\apache-maven\3.3.9\conf\setting.xml
<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>
-->
<localRepository>D:\maven\repository</localRepository>
</settings>
依据该配置,Maven就会将下载的类库保存到D:\maven\repository中。
检查配置是否成功:cmd窗口中输入:mvn help:system
如果没有任何问题,执行完该命令之后,在D:\maven\repository下面就会多出很多文件,这些文件就是maven从中央仓库下载到本地仓库的文件,maven已经开始为我们工作了。
了解Maven仓库
使用 Maven 给我们带来的最直接的好处,就是统一管理jar 包。
实际上我们可以将本地仓库理解“缓存”,目的是存放jar包。开发项目时项目首先会从本地仓库中获取 jar 包,当无法获取指定 jar 包的时候,本地仓库会从 远程仓库(或 中央仓库) 中下载 jar 包,并“缓存”到本地仓库中以备将来使用。
远程仓库(中央仓库)是 Maven 官方提供的,可通过 http://search.maven.org/ 来访问。这样一来,本地仓库会随着项目的积累越来越大。
搜索jar包
MVNrepository(推荐:速度快)
The Central Repository
OutOfMemory 的中央仓库(速度快)
OSChina 的中央仓库(不稳定)
特点
jar包依赖
Maven 最突出的特点,使用 Maven 后,无需单独下载 jar 包,只需在 pom.xml 文件里配置 jar 包的依赖关系,Maven 就会自动将 jar 包下载并应用到我们的项目里了。另外 Maven 对 jar 包版本号的精准控制还能避免 jar 包版本不一致情况的发生。
同时,其他人开发或者使用此工程时,也无需拷贝 jar 包,只需要复制这个 pom.xml 就可以自动下载这些jar包了。
项目坐标
Maven 通过特定的标识来定义项目名称,这样既可以唯一的匹配其他的jar包,也可以通过发布,使别人能使用自己的发布产品。这个标识就被叫做坐标(其实就是简单的xml):
<groupId>com.test</groupId>
<artifactId>maventest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maventest</name>
<url>http://maven.apache.org</url>
参数
groupId:项目名称。有些项目并不是一个jar包构成的,而是由很多的jar包组成的。因此这个groupId就是整个项目的名称。
artifactId:包名称
version:版本号
packaging:包的类型,一般都是jar,也可以是war之类的。如果不填,默认就是jar
name和url,一个是名称,一个是maven的地址。
jar 包的命名规则:artifactId-version[-classifier].packaging
如上就是:maventest-0.0.1-SNAPSHOT.jar
classifier 是可选的,但是有的项目可能还需要导出附属的一些文件,如javadoc,source等等,那么这个地方就需要配置一个字符串。一般都是JDKXXX之类的。
jar 包依赖
<properties>
<junit.version>4.12</junit.version>
</properties>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
测试驱动
Maven是测试驱动的开发思路,因此工程创建初期,就包含两个文件夹,main和test。一个用于放置开发的java文件,一个用于写test单元测试。这样每次开发的时候,提前设计单元测试,就能帮助减少BUG。
相关书籍:《Maven权威指南》《Maven实战》等
Eclipse中使用Maven
maven 2.1默认用jdk 1.3来编译,maven 3 貌似是用jdk 1.5
Eclipse中创建Maven工程
新建工程
1、新建——Maven——Maven Project
2、选择默认的工程位置:勾选Use default workspace location
3、创建普通Maven工程选择 maven-archetype-quickstart,创建web 工程选择 maven-archetype-webapp
4、填写相关的groupId artifactId version等信息即可。
Eclipse中Maven常用的命令
点击Run As就可以发现几个Maven的命令:
- Maven Build:编译Maven工程,执行命令后会在target文件夹中的classes中生成对应的class文件。
- Maven Clean:删除target文件夹,即删除生成的package包以及class等文件。
- Maven package:把jar打到本项目的target下。
- Maven Test:先自动进行编译,再运行所有的测试用例。
- Maven install:把target下的jar安装(发布)到本地仓库。
注:Maven 3.3以上版本是自动编译的,无需再单独执行Maven Build或Maven Test了。
Maven内置属性
Maven内置了三大特性:属性、Profile和资源过滤来支持构建的灵活性。
Maven属性
六种类型:
- 内置属性:
${basedir}
项目根目录(包含pom.xml文件的目录);${version}
项目版本。 - POM属性:pom中对应元素的值。例如
${project.artifactId}
对应了<project><artifactId>
元素的值,常用的POM属性包括:
${project.build.sourceDirectory}
项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}
项目的测试源码目录,默认为/src/test/java/
${project.build.directory}
项目构建输出目录,默认为target/
${project.build.outputDirectory}
项目主代码编译输出目录,默认为target/classes/
${project.build.testOutputDirectory}
项目测试代码编译输出目录,默认为target/testclasses/
${project.xxx}
当前pom文件的任意节点的内容,如${project.basedir}
项目根目录,与${basedir}
等价;${project.groupId}
项目的groupId;${project.artifactId}
项目的artifactId;${project.packaging}
打包类型(缺省为jar);${project.version}
项目的version,与${version}
等价;
${project.build.finalName}
项目打包输出文件的名称,默认为${project.artifactId}${project.version}
- 自定义属性:在pom.xml中
<properties>
元素下自定义的Maven属性 - Settings属性:与POM属性同理。如
${settings.localRepository}
指向用户本地仓库的地址 - Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。可以通过命令行 mvn help:system 查看所有的Java系统属性
- 环境变量属性:所有环境变量都可以使用以env.开头的Maven属性引用。例如
${env.JAVA_HOME}
指代了JAVA_HOME环境变量的值。也可以通过命令行mvn help:system查看所有环境变量。
注:使用 mvn 命令查看系统属性mvn help:system
资源过滤
默认情况下,Maven属性只有在POM中才会被解析。资源过滤就是指让Maven属性在资源文件(src/main/resources、src/test/resources)中也能被解析。
在POM中添加下面的配置便可以开启资源过滤
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
从上面的配置中可以看出,我们其实可以配置多个主资源目录和多个测试资源目录。
Maven除了可以对主资源目录、测试资源目录过滤外,还能对Web项目的资源目录(如css、js目录)进行过滤。这时需要对maven-war-plugin插件进行配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-beta-1</version>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp</directory>
<includes>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
Maven Profile
每个Profile可以看作是POM的一部分配置,我们可以根据不同的环境应用不同的Profile,从而达到不同环境使用不同的POM配置的目的。
profile可以声明在以下这三个文件中:
- pom.xml:很显然,这里声明的profile只对当前项目有效
- 用户settings.xml:.m2/settings.xml中的profile对该用户的Maven项目有效
- 全局settings.xml:conf/settings.xml,对本机上所有Maven项目有效
非常值得注意的一点是,profile在pom.xml中可声明的元素在settings.xml中可声明的元素是不一样的。
- profile在pom.xml中可声明的元素:
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<distributionManagement></distributionManagement>
<dependencies></dependencies>
<dependencyManagement></dependencyManagement>
<modules></modules>
<properties></properties>
<reporting></reporting>
<build>
<plugins></plugins>
<defaultGoal></defaultGoal>
<resources></resources>
<testResources></testResources>
<finalName></finalName>
</build>
</project>
- profile在settings.xml中可声明的元素
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<properties></properties>
</project>
激活Profile
有多种激活Profile的方式:
1. 命令行方式激活,如有两个profile id为devx和devy的profile
mvn clean install -Pdevx,devy
- settings文件显式激活
<settings>
...
<activeProfiles>
<activeProfile>devx</activeProfile>
<activeProfile>devy</activeProfile>
</activeProfiles>
...
</settings>
- 系统属性激活,用户可以配置当某系统属性存在或其值等于期望值时激活profile,如
<profiles>
<profile>
<activation>
<property>
<name>actProp</name>
<value>x</value>
</property>
</activation>
</profile>
</profiles>
不要忘了,可以在命令行声明系统属性。如:
mvn clean install -DactProp=x
这其实也是一种从命令行激活profile的方法,而且多个profile完全可以使用同一个系统属性来激活。别忘了,系统属性可以通过mvn help:system来查看。
- 操作系统环境激活,如
<profiles>
<profile>
<activation>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
</activation>
</profile>
</profiles>
这里的family值包括Window、UNIX和Mac等,而其他几项对应系统属性的os.name、os.arch、os.version
- 文件存在与否激活,Maven能根据项目中某个文件存在与否来决定是否激活profile
<profiles>
<profile>
<activation>
<file>
<missing>x.properties</missing>
<exists>y.properties</exists>
</file>
</activation>
</profile>
</profiles>
注:插件maven-help-plugin提供了一个目标帮助用户了解当前激活的profile:
mvn help:active-profiles
另外还有一个目标来列出当前所有的profile:
mvn help:all-profiles
maven引入自定义jar的三种方式
引入方式一
假如你自定义的jar包是util.jar,你想在你项目的pom.xml中这样引入你的jar包
<dependency>
<groupId>com.apple</groupId>
<artifactId>util</artifactId>
<version>1.0</version>
</dependency>
在你的 localRepository 根目录文件夹下建 com 文件夹、apple 文件夹 -> 再创建 util 文件夹 -> 再创建1.0文件夹 -> 最后把 util.jar 放到 1.0 文件夹下 -> 把 util.jar改为 util-1.0.jar,并创建文件 util-1.0.pom(util-1.0.pom内容如下):
<project>
<modelVersion>1.0.0</modelVersion>
<groupId>com.apple</groupId>
<artifactId>util</artifactId>
<version>1.0</version>
</project>
此时就可以在使用了。
如果pom.xml报错,强制更新下pom.xml文件:Maven->Update Project,勾上 force update of snapshots/releases 选项,更新一下工程即可。
引入方式二(推荐)
对于常用的包建议使用此方法。
确保在cmd当中可以正确使用mvn命令(通过mvn -v可以验证),然后使用如下命令。
mvn install:install-file -Dfile=sosjon-demo.jar -DgroupId=com.sojson -DartifactId=com.sojson.demo -Dversion=1.0 -Dpackaging=jar
参数说明:
mvn install:install-file // mvn 命令
-Dfile=sosjon-demo.jar // 要添加的包
-DgroupId=com.sojson // pom文件对应的groupId
-DartifactId=com.sojson.demo // pom文件对应的artifactId
-Dversion=1.0 // 添加包的版本
-Dpackaging=jar //
-Dfile参数指你自定义JAR包文件所在的路径,并依次指定了自定义的GroupId、ArtifactId和Version信息。
通过这种方式,可以简单快速地将第三方JAR包安装到本地仓库中供Maven项目依赖使用。
<dependency>
<groupId>com.tech4j.driver</groupId>
<artifactId>oracle-connector-java</artifactId>
<version>12.1</version>
</dependency>
引入方式三
不太建议使用此方法,因为Maven是用来团队合作、发布开源代码的。而使用本地jar包,使得Maven丧失了这部分的优点。
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>4.2.3</version>
<type>war</type>
<!-- 注意scope是system -->
<scope>system</scope>
<!-- <systemPath>C:/Users/ice-wee/Downloads/cas-server-webapp-4.0.3.war</systemPath> -->
<systemPath>${project.basedir}/suiyijiandewenjianjia/cas-server-webapp-4.0.3.war</systemPath>
<!-- systemPath 可以写 1 本地路径 也可以写 2 项目根路径,项目根路径不是相对classpath 。 -->
</dependency>
此方法不会把 jar 包打进 war 包中,如果想打进 war 包中,还是建议使用上面两种方式。或者是添加如下配置:
<build>
<finalName>weixin</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>${project.basedir}\</directory>
<targetPath>WEB-INF/lib</targetPath>
<filtering>true</filtering>
<includes>
<include>pinyin4j-2.5.0.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
参数说明:
directory是pinyin4j.jar的路径
targetPath则是编译后要把这些jar包复制到的位置
创建jar文件
使用Eclipse的Export功能,类型选择Java -> JAR file,导出即可。