maven使用

时间:2022-03-21 20:44:16

Maven是一个项目管理和构建自动化工具。但是对于我们程序员来说,我们最关心的是它的项目构建功能,它定义了项目开发的几个标准步骤:编译,发布,单元测试及部署以帮助项目开发

最简单的时候场景是,在pom.xml里设置对第三方jar包的依赖,而不用所有用到的jar包都复制到工程lib目录,再配置javapath。

它所有的项目都有如下的结构:

目录  目的  
${basedir} 存放 pom.xml和所有的子目录
${basedir}/src/main/java 项目的 java源代码
${basedir}/src/main/resources 项目的资源,比如说 数据源配置文件,spring配置文件
${basedir}/src/test/java 项目的测试类,比如说 JUnit代码
${basedir}/src/test/resources 测试使用的资源

一个 maven 项目在默认情况下会产生 JAR 文件,另外,编译后 的 classes 会放在${basedir}/target/classes 下面, JAR 文件会放在 ${basedir}/target 下面。

当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错

 1.maven仓库:

1.1查看maven*仓库地址:

  打开$home\apache-maven-3.2.1\lib中的maven-model-builder-3.2.1.jar,找到pom.xml,

   地址就是http://repo.maven.apache.org/maven2

1.2修改本地仓库

  在D盘下新建m2\repository文件夹

  可以通过修改${user.home}/.m2/settings.xml配置本地仓库路径

  修改Maven安装目录下的 conf/文件夹内的setting.xml文件,新增一行:

    <localRepository>D:\m2\repository</localRepository>

    (表示本地仓库的地址为:D:\m2\repository)

  将setting.xml复制一份到

  D:\m2\repository目录下

1.2.1 修改Eclipse中的maven配置

1.打开eclipse点击windows->preferences->maven->installations下add一个已经安装到D:\maven\目录下的maven,如:D:\maven\apache-maven-3.3.3

2.打开eclipse点击windows->preferences->maven->User setting下修改user setting选项为:D:\m2\repository\settings.xml,并点击update settings。并点击下面的reindex按钮更新索引。

3.点击配置窗口的apply按钮,突出配置窗口。

1.3 修改远程仓库

阿里云*仓库:http://maven.aliyun.com/nexus/content/groups/public/

修改maven根目录下的conf文件夹中的setting.xml文件,内容如下:

 <mirrors>

<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
2.maven坐标

groupId,artifactId,version

这三个元素组成了Maven的坐标,它相当为项目在Maven世界中的ID。

其中:

Group Id:项目名

Artifact Id:项目模块名

Version:项目的版本号,后缀SNASHOT为快照的意思,表示版本不稳定

mvn命令

mvn插件地址:http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/

cmd中输入mvn:报

maven使用

即要求mvn命令需要配合插件命令或生命周期阶段使用

2.1 以自动生成项目骨架为例

使用插件maven-archetype-plugin

在http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/  (org/apache/maven/plugins是groupid)

执行分析: mvn help:describe -Dplugins=org.apache.maven.plugins:maven-archetype-plugin 

执行成功,内容如下:

maven使用

其中可以用别名goal prefix定位插件,即可以用mvn help:describe -Dplugin=archetype (一般mvn的前缀是中间那个单词)

另外,该插件有8个功能,archetype:create archetype:generate等


注意:

命令运行很慢的解决方案

问题:生成项目骨架时,需要模板文件,默认的模板文件需要到中心仓库下载大约5M的XML文件(http://repo.maven.apache.org/maven2/archetype-catalog.xml),因为*仓库在国外,导致运行很慢

解决办法:方法1:将此文件下载,放到本地仓库,用mvn archetype:generate -DarchetypeCatalog=local

方法2:使用内置的原型文件  mvn archetype:generate -DarchetypeCatalog=internal

  • 创建一个简单的java工程:mvn archetype:generate
  • 创建一个简单的Java工程:mvn archetype:create -DgroupId=com.mycompany.example -DartifactId=Example
  • 创 建一个java的web工程:mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp

2.2 将项目导入eclipse

eclipse识别项目,需要项目根目录下面有.classpath和.project文件

在mvn plugin中http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/查找eclipse

cmd中查看插件详情:mvn help:describe -Dplugin=eclipse

执行eclipse:eclipse目标,生成eclipse配置文件

然后ide就可以导入了。

如IDE报M2_REPO错误,需要在build path中添加M2_REPO变量,指向MAVEN本地仓库地址

2.3编译执行

分析插件:mvn help:describe -Dplugin=compiler,使用compiler:compile目标

执行mvn compiler:compile

  • 打包:mvn package
  • 编译:mvn compile
  • 编译测试程序:mvn test-compile
  • 清空:mvn clean
  • 运行测试:mvn test
  • 生成站点目录: mvn site
  • 生成站点目录并发布:mvn site-deploy
  • 安装当前工程的输出文件到本地仓库: mvn install
  • 安 装指定文件到本地仓库:mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>
  • 查看实际pom信息: mvn help:effective-pom
  • 分析项目的依赖信息:mvn dependency:analyze 或 mvn dependency:tree
  • 跳过测试运行maven任务:    mvn -Dmaven.test.skip=true XXX
  • 生成eclipse项目文件: mvn eclipse:eclipse
  • 查看帮助信息:mvn help:help 或 mvn help:help -Ddetail=true
  • 查看插件的帮助信息:mvn <plug-in>:help,比如:mvn dependency:help 或 mvn ant:help 等等。


2.4 添加需要依赖包,配置pom.xml

  <dependencies>
  <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
  </dependency>
  </dependencies>
  </project>

  其中groupid、artifactId、version是三坐标,定位jar包

dependencies

项目依赖,由1到N个dependency组成,每个dependency包含了一个坐标和依赖范围scope

其中scope默认为compile,表示该依赖对主代码和测试代码都有效,

test则表示该依赖只对测试有效,即测试代码中可以使用Junit-3.8.1.jar中的内容,主代码不能使用

找需要的jar资源:http://mvnrepository.com/

加入pom.xml中

执行mvn eclipse:eclipse

3.maven命令

插件命令

生命周期阶段命令

关系:

生命周期阶段命令是插件命令的有序集合

Maven有三套相互独立的生命周期

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有点绕?要知道有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  • pre-clean  执行一些需要在clean之前完成的工作
  • clean  移除所有上一次构建生成的文件
  • post-clean  执行一些需要在clean之后立刻完成的工作

mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。

下面看一下Site生命周期的各个阶段:

  • pre-site     执行一些需要在生成站点文档之前完成的工作
  • site    生成项目的站点文档
  • post-site     执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy     将生成的站点文档部署到特定的服务器上

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,

最后,来看一下Maven的最重要的Default生命周期,绝大部分工作都发生在这个生命周期中,这里,我只解释一些比较重要和常用的阶段:

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources     复制并处理资源文件,至目标目录,准备打包。
  • compile     编译项目的源代码。
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources     复制并处理资源文件,至目标测试目录。
  • test-compile     编译测试源代码。
  • process-test-classes
  • test     使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • prepare-package
  • package     接受编译好的代码,打包成可发布的格式,如 JAR 。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install     将包安装至本地仓库,以让其它项目依赖。
  • deploy     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。

此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要

Project Object Model,项目对象模型。

通过xml格式保存的pom.xml文件。

作用类似ant的build.xml文件,功能更强大。

该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。

POM间的关系

依赖关系列表(dependency list)是POM的重要部分。

  <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
...
</dependencies>

如何查到依赖的类库?

一般可以通过这个网站:http://www.mvnrepository.com/

比如查询hibernate,可以找到结果列表中的hibernate类库条目。

http://www.mvnrepository.com/artifact/org.hibernate/hibernate-core

点击版本,即http://www.mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.5.Final

复制文章中的:

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.5.Final</version>
</dependency>

到pom.xml文件中即可。

是否还需要找到hibernate依赖的pom?

不需要,hibernate也会有pom,maven会通过它的pom自动找到它依赖的类库。

继承关系

继承其他pom.xml配置的内容。

maven提供了一个类似java.lang.Object的*父pom.xml文件。

可以通过下面命令查看当前pom.xml受到超pom.xml文件的影响:


安装第三方包

经常有第三方包,因为一些原因,在网上repository上没有,需要自己动手安装。

比如sun某些版本的jar文件,比如oracle的驱动。

已oracle驱动程序为例,比如驱动路径为c:/driver/ojdbc14.jar,是10.2.0.3.0版本

在该网址能够查到:http://www.mvnrepository.com/artifact/com.oracle/ojdbc14 artifactId和groupId。

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=c:/driver/ojdbc14.jar

这样就可以在pom中依赖引用了:

<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.3.0</version>
</dependency>

部署到tomcat

tomcat配置有管理权限的用户:conf\tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<user username="marshal" password="password" roles="manager"/>
</tomcat-users>

在pom文件的tomcat插件中添加:

                        <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8080/manager</url>
<server>myserver</server>
<path>/mycontext</path>
</configuration>
</plugin>

在.m2/settings.xml文件中增加:

<settings 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/settings-1.0.0.xsd">
<servers>
<server>
<id>myserver</id>
<username>marshal</username>
<password>password</password>
</server>
</servers>
</settings>

运行打包部署,在maven项目目录下:

mvn tomcat:deploy

然后访问:http://localhost:8080/mycontext/ 即可。

撤销部署:

mvn tomcat:undeploy

启动web应用:

mvn tomcat:start

停止web应用:

mvn tomcat:stop

重新部署:

mvn tomcat:redeploy

部署展开的war文件:

mvn war:exploded tomcat:exploded