Maven环境搭建以及使用要点
Maven环境搭建以及使用要点
一、安装maven
二、配置maven
三、从头开始使用maven进行项目构建
四、eclipse集成maven
五、项目示例
一、安装maven
首先,确保jdk已正确安装[windows下使用echo %JAVA_HOME%命令可以快速查看jdk路径];
然后,下载maven包,解压到不含中文路径文件下,解压后,将bin路径加入到path环境变量中;
最后,验证是否安装成功,打开命令窗口,输入命令mvn -v,出现如下信息:
安转成功!
二、配置
maven的配置文件有两个通用的配置路径,但是有效范围不同:
- Maven的全局配置 : ${maven.home}/conf/settings.xml;
- 针对用户的配置 : ${user.home}/.m2/settings.xml
前面的路径作为全局配置,后面的作为该用户特定的配置。
接下来介绍配置文件的细节:
1、简单配置
<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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>${user.home}/.m2/repository</localRepository>
<interactiveMode>true</interactiveMode>
<usePluginRegistry>false</usePluginRegistry>
<offline>false</offline>
...
</settings>
- localRepository:表明本地仓库位置,默认路径是${user.home}/.m2/repository,但是默认路径会根据不同的登录用户而有所差别。
- interactiveMode:默认true,maven是否允许与用户交互输入。【不明】
- usePluginRegistry:默认为false,maven是否使用${user.home}/.m2/plugin-registry.xml管理plugin版本。
- offline:默认为false,是否使用离线模式,出于安全考虑或者不能连接到远程仓库。
2、plugin Groups
该节点维护一个pluginGroup列表,自动包含:org.apache.maven.plugins和org.codehaus.mojo,包含一系列的pluginGroup,每一个包含一个groupId。在用命令行操作时,当一个插件被使用到时会从该列表中搜索,从而简化命令行操作,如:
<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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<pluginGroups>
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
...
</settings>
当需要执行org.mortbay.jetty:jetty-maven-plugin:run时,可以使用一下简化命令:mvn jetty:run。
3、servers
仓库的下载和部署是在pom中通过repositories和distributionManagement来定义的,然而,必要的配置,如账号、密码不应该在具体的pom.xml中每次都单独配置,这种配置需要存在于构建服务器的配置文件中,即settings.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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<servers>
<server>
<id>server001</id>
<username>my_login</username>
<password>my_password</password>
<privateKey>${user.home}/.ssh/id_dsa</privateKey>
<passphrase>some_passphrase</passphrase>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
</servers>
...
</settings>
- 上面配置包含了两种配置形式,一种是账号密码(由username和password组合使用),另一种是秘钥通行证方式(由privateKey和passphrase组合使用)。
- id:这是试图连接到的仓库\镜像的相匹配的服务器的id(不是用户登录的)。【不明】
- filePermissions:文件限制数(一般不用配置)
- directoryPermissions:目录限制数(一般不用配置)
4、mirrors
远程仓库的配置
<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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<mirrors>
<mirror>
<id>planetmirror.com</id>
<name>PlanetMirror Australia</name>
<url>http://downloads.planetmirror.com/pub/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
- id,name:mirror的用户体验友好的唯一标识,id是用来区分不同mirror的,并且在连接到mirror时,从servers中挑出相配的证书。
- url:mirror的基本url,构建系统将优先使用该url去连接仓库而不是原始的url。【不明】
- mirrorOf:mirror的仓库的id,例如,指向mirror的maven中央库,那么设置为“central”,更高级的配置如repo1、repo2或者*,!inhouse。它不能与id一致。【不明】
5、Profiles
<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
https://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<profiles>
<profile>
<id>f1nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>f1nexuspublic</name>
<url>私服仓库地址</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
...
</settings>
该settings.xml中profile节点是pom中profile节点的删节版本,因为是作为一个通用配置,它有且仅包含了activation, repositories, pluginRepositories 和 properties节点,如果settings文件中一个profile是激活的,他的值将覆盖pom中的profiles中的值。
三、从头开始使用maven进行项目构建
一、maven项目的搭建可以有两种方式:
- mvn命令(使用maven提供的模板进行项目初始化):mvn -B archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=com.f1.app
-DartifactId=f1-app - ide工具创建:
使用eclipse或idea。
文章最后将介绍ied的方式操作maven,进行项目的构建。
二、项目构建过程
运行完后第一步中的mvn命令后,打开目录:
这是一个典型的maven项目的目录结构,应用的源码在${basedir}/src/main/java,测试的源码在${basedir}/src/test/java,并且可以看到我们一直说的pom.xml文件。
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.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.f1.app</groupId>
<artifactId>f1-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
接下来开始你的项目构建之旅!
- 我该如何编译我的项目?
mvn compile
执行完之后,项目路径下${basedir}/target/classes,找到后,会发现我们的项目已经被编译。 - 我该如何编译测试类并且运行单元测试?
mvn test
该命令会编译并运行单元测试,展示结果。
如果仅仅是编译但不执行,使用如下命令:
mvn test-compile - 我该怎样将项目打包成jar,安装到本地仓库?
首先 :mvn package
查看${basedir}/target目录,我们的项目已经打包完毕。
然后 :mvn install
查看本地仓库,可以发现路径中已经存在我们的项目jar包,so easy!就安装到了本地仓库。
打包过程中常用命令还有:
mvn clean:此命令会清除target目录下的文件。
mvn idea:idea:生成 IntelliJ IDEA的描述文件
mvn eclipse:eclipse:生成eclipse的描述文件 - 什么是snapshot和realease?
snapshot相当于非正式版本,并不是稳定的、无错的;是我们平时开发过程中用的最多的版本命名方式;而release版本是发布的正式版本。
注意,当把版本号中带有snapshot的版本部署到realease版本库中时会提醒不能部署! 我该如何使用plugin?
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
你会注意到maven中的plugin看起来像是依赖,尽管某种意义上确实是。
plugin将会按照你配置的版本号进行自动下载和使用(如果不是指定将默认使用最新版本)。
configuration 节点应用给定的参数到每个编译的目标,在上述情况下,编译器插件总是构建过程的一部分,这只是改变了这个配置。它也能添加新的目标、配置特殊的目标到构建过程中我该怎样把我的资源文件打包时添加到jar包中?
以下是标准的文件构成,也是maven默认的目录结构:
这个架构下的文件均会在打包过程中自动打入进jar包。我该如何过滤资源文件?
有些情况一个资源文件需要一个只能在构建过程中才能确定的值。为了达到这个目标,maven允许使用${propertyname}进行引用,这个属性可以是pom中定义的值、用户的settings文件、一个额外的属性文件的定义的属性或者是一个系统变量。
为了在设置值时能找到其他的资源为自己使用,需要在中设置为true。这样该资源文件就可以使用其他资源文件的属性了。
如下:
我的资源文件:resoures/application.properties:
application.name=\${project.name}
application.version=\${project.version}
message=\${my.filter.value}
messages=\${gxx.filter.value}
pom.xml:<!-- 将该路径文件加入到可提供值的源中(若其他文件加入到了filter中:true) --> <filters> <filter>src/main/filters/filters.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <!-- 设置为true{最高级开关}才能在配置文件中读取filter中属性 能屏蔽 -Dgxx.filter.value=hhhhhh 方式赋值--> <filtering>true</filtering> </resource> </resources> </build> <!-- 能够被本文件和其他文件获取到(若其他文件加入到了filter中:true) --> <properties> <gxx.filter.value>f13.0</gxx.filter.value> </properties>
同样,使用命令:mvn process-resources “-Dgxx.filter.value=hello again”处理资源命令也可以为application.properties设置值
我该如何为项目添加依赖?
<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"> <groupId>com.f1.app</groupId> <artifactId>my-other-app</artifactId> ... <dependencies> ... <dependency> <groupId>com.f1.app</groupId> <artifactId>f1-app</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> </project>
依赖中其他节点含义已经介绍过,来专门介绍下,它代表你的依赖将被用作何种方式使用,可配置项有以下几个:默认是compile,还有test、runtime等。compile就是编译时需要依赖进去,而test就是单元测试过程中依赖。
我该如何部署我的jar包到我配置好的远程仓库?
项目pom.xml中配置格式如下:<distributionManagement> <repository> <id>f1-repository</id> <name>f1Repository</name> <url>仓库地址</url> </repository> </distributionManagement>
依此,我们的项目pom.xml如下配置:
<distributionManagement> <repository> <id>f1-nexus-releases</id> <name>f1-nexus-releases</name> <url>http://psdpt.joinbright.com:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>f1-nexus-snapshots</id> <name>f1-nexus-snapshots</name> <url>http://psdpt.joinbright.com:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
上面分别配置了snapshot版本库和release版本库。
执行:
mvn deploy
即可将我们的项目jar包部署到远程仓库。接下来,我该如何一次性将多个有关联的项目进行打包呢?
场景:我的f1-app,依赖于另一个项目web-app,打包时,需要将该依赖加进来。
那么,看一下该场景典型的目录结构:
该顶层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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.f1.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>f1-app</module> <module>f1-webapp</module> </modules> </project>
然后,在webapp中加入依赖:
<dependencies> <dependency> <groupId>com.f1.app</groupId> <artifactId>f1-app</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
最后,在两个项目的pom.xml中加入,作为顶层pom的继承者:
<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"> <parent> <groupId>com.f1.app</groupId> <artifactId>app</artifactId> <version>1.0-SNAPSHOT</version> </parent>
在顶层pom.xml所在目录执行命令:mvn clean install
一切Ok!
那么,解释一下都发生了什么:
首先,主pom文件建立,打包方式(packaging)设置为pom,并且定义了一个module清单。这些设置,告诉maven来运行所有设置的操作,而非当前的这一个项目(当然,你也可以设置该模式,在执行命令时,加入参数–non-recursive来顶替这个行为)。
然后,我们通知将要打的包:webapp,它还需要依赖另一个项目:f1-app。这将保证在打webapp包之前能够将f1-app的jar包打好,并且在webapp的library会有f1-app。
另外,说一点,如果依赖时,将设置为test(非默认或者非compile),打好的包中将不会包含该依赖。
最后一步,就是需要加入的定义,这与有所区别,因为它(parent)确保了pom总是能够被找到,即使这个项目是通过分布式独立于parent的。
上面这几步是需要执行run来确保成功的。
四、eclipse集成maven
eclipse中配置已安装的maven:
1. window->preferences->Maven;
2. Installations中,查看是否是我们安转的maven,若不是,点击“add”,定位到maven的安装路径下,确定;
3. User Settings中,按如下方式配置:
4. 至此,可以开始在eclipse开始我们的maven项目了
new->Maven Project
五、项目示例
首先,项目中实际使用时,需要建立pom.xml进行依赖的管理,常用的配置如下:
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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 遵守哪个版本的项目描述符 -->
<modelVersion>4.0.0</modelVersion>
<artifactId>f1-filesystem</artifactId>
<name>filesystem</name>
<packaging>jar</packaging>
<!-- 继承关系描述 -->
<parent>
<artifactId>f1-parent</artifactId>
<groupId>com.joinbright.f1</groupId>
<version>3.0.0-SNAPSHOT</version>
</parent>
<!-- 依赖项 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
...........
</dependencies>
</project>
当maven的settings文件配置好后,就可以进行项目的打包等操作了。到该项目路径下(存在pom.xml的路径),打开命令行窗口,执行mvn clean install,
如下:
此时,在本地仓库中,便能看见install后的jar包
关于maven更多操作,请查阅maven官网Run篇。
好了,开始我们的maven之旅吧!