Maven学习笔记

前言:学习Maven之前最好有点JavaSE与JavaEE的基础以及单元测试JUnit的了解。

一、简介

官网:http://maven.apache.org/

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。简单来说是一套自动化的构建工具。

视频教程:

项目管理利器——maven

1.1 Maven的Windows环境搭建

JDK的要求(官网):Maven 3.3 requires JDK 1.7 or above to execute(Maven 3.3 需要JDK1.7及以上的版本支持)。

与JDK的安装类同,只需要配置环境变量即可。需要注意的是环境变量的名称为:M2_HOME,值指向安装(解压后放置)目录。然后将%M2_HOME%\bin;添加到PATH中去就可以了。

验证是否安装成功:

如果上面的基本信息都可以看到,那么环境就搭建好了。

1.2 仓库

  使用git等项目管理工具的伙伴们对这个概念并不陌生,Maven有一个全球的中央仓库,我们可以在本地建立一个本地仓库,当我们需要相应Jar文件,Maven就会在本地仓库中查询是否包含,没有就会到中央仓库中进行查询,查询到就会下载到本地仓库,这样我们就可以使用(全是自动添加的)了并且下次就可以从本地仓库中直接读取了。

官方提供的仓库架构图:

查看默认的全球中央仓库的配置:

<1>进入Maven安装目录下的lib目录,并用解压软件打开maven-model-builder-*.jar文件

<2>一路打开,到文件夹比较多的时候,可以看到下面的pom-4.0.0.xml,并将其打开:

<3>在文件的开头部位中就可以看到这个配置信息了

1.3 Maven的配置

使用Apache Maven以及项目的构建所需要的设置有如下几个部分(The configuration for Apache Maven usage itself and projects built with resides in a number of places):

  • MAVEN_OPTS环境变量。这个变量包含了用来启动JVM来运行Maven时的一些参数,并且可以提供额外的选项应用到Maven的全局设置中。例如:可以使用-Xms256m -Xmx512m这样的值来指定JVM的内存大小。(This variable contains parameters used to start up the JVM running Maven and can be used to supply additional options to globally to Maven. E.g. JVM memory settings could be defined with the value -Xms256m -Xmx512m.)
  • settings.xml文件。这个配置文件位于USER_HOME/.m2文件夹中,其包含了所有的关于Maven的全局设置。(Located in USER_HOME/.m2 the settings files is designed to contain any configuration for Maven usage across projects.)
  • .mvn文件夹。这个文件夹位于项目的顶层文件夹中,maven.config 和extensions.xml 两个文件包含了运行Maven时项目的具体配置。(Located with in the projects top level folder, the filesmaven.config andextensions.xml contain project specific configuration for running Maven.)

settings.xml文件出现的两个位置:

  1. The Maven install(Maven的安装目录): ${maven.home}/conf/settings.xml
  2. A user’s install(使用者的目录): ${user.home}/.m2/settings.xml

  The former settings.xml are also called global settings, the latter settings.xml are referred to as user settings. If both files exists, their contents gets merged, with the user-specific settings.xml being dominant.

  前者是全局设置,后者被称为用户设置。如果两个文件都存在,他们的内容就会被合并,但是用户设置占据主导地位。简单来说就是:用户设置有的使用用户设置,没有的才去使用全局设置。

  我建议大家将conf文件夹下的setting.xml拷贝一份到USER_HOME/.m2文件夹下,并只对USER_HOME/.m2文件夹下的setting.xml文件进行修改,这样即使我们出了点错,也可以在安装目录下找到原有配置文件,以防万一嘛。

更详细的配置参考:Maven学习笔记之配置文件(settings.xml)

1.4 项目的设置

  Maven is a project development management and comprehension tool. Based on the concept of a project object model: builds, dependency management, documentation creation, site publication, anddistribution publication are all controlled from the pom.xml declarative file.

  Maven是一个项目开发管理和理解工具。基于project object model(POM)概念之上:构建,依赖管理,文档创建,站点发布和都是有pom.xml这个生命文件所控制的。

关于pom.xml更详细的信息参考:

 

二、实践

2.1 本地仓库位置更改

默认的仓库位置为${user.home}/.m2/repository中,因为其在C盘,建议进行更改。当然不更改也没有关系。

<1>进入安装目录下的conf目录,并打开settings.xml文件

<2>找到settings,更改<localRepository>标签就可以了。

<3>更改后在控制台下输入mvn help:system命令,你会看到一直在下载东西。

最终可以看到:

在刚才更改的本地仓库中你会看到下载的一些文件:

2.2 更改全球中央仓库的地址

  虽然包含了绝大多数的开源项目,但是服务器都是国外的,我们国家伟大的墙,使得我们有时无法访问,但是我们可以访问国内的镜像仓库。

<1>进入安装目录下的conf目录,并打开settings.xml文件

<2>找到<mirrors>标签,然后进行添加子标签。

注意:一旦配置了镜像,将对中央仓库的访问都会转向镜像,中央仓库将无法访问。(片面的理解)

注意:<mirrorOf>配置的是要被重定向的仓库的id,也就是说值为central,就是对中央仓库做了镜像,针对中央仓库的访问都会转向到配置的镜像上。

三、使用入门

3.1 编写POM

  Maven项目的核心是pom.xml,POM(Project Object Model项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目的依赖。pom.xml是一个XML文件,所以遵循基本的结构方式,POM的根节点是project,如下:

<?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>
</project>

针对性的写法可以参考官网资料:the pom.xml declarative file
子元素modelVersion指定了当前的POM模型的版本,对于Maven2和Maven3来说,他只能是4.0.0。也可以这样理解,上面的部分是固定的。

最重要的三个子元素(任何一个Maven项目最基本的坐标):

  • groupId:定义项目属于哪个组。(命名格式通常与所在的组织或公司存在关联,例如:com.公司名.项目名)
  • artifactId:定义了当前Maven项目在组中唯一的ID。换句话说就是不同的子项目(模块)的名称,但是唯一的。
  • version:指定了项目当前的版本。(一般为SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。更多详细的以后详解)
  • name:声明一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name,以方便信息交流

3.2 代码遵循的基本规则

  项目主代码位于src/main/java目录下,测试代码位于src/test/java目录下。这是我们必须遵循的Maven约定,否则我们还得去更改默认的配置,不想多事,就遵循默认的约定。

  一般来说,项目中Java类的包命名都应该基于项目的groupId和artifactId,这样更加清晰,更加符合逻辑,也方便搜索构件或者Java类。

3.3 添加依赖jar包

  在pom中添加dependencies元素,这个元素下可以包含多个dependency元素以声明项目的依赖。我们通常使用的是JUnit进行单元测试,所以以添加JUnit4.7依赖为例,如下:

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.7</version>
    <scope>test</scope>
  </dependency>
</dependencies>

  其中前三个元素就是前面提到的,其中scope元素为依赖范围,若依赖范围为test则表示该依赖只对测试有效。如果不声明依赖范围,那么默认值就是compile,表示该依赖对主代码和测试代码都有效。
注意:只有配置了上面的测试依赖才可以运行测试类,虽然说起来有点多余,但是还是需要提醒一下。

3.4 常用命令

  • mvn clean compile //清理和编译源代码
  • mvn clean test //清理和运行测试代码
  • mvn clean package //清理和将项目进行打包
  • mvn clean install //安装当前项目到Maven的本地仓库

  运行上述命令通常会在项目的根目录下创建一个target目录,所有Maven的输出都会放到这个目录下。执行的大概顺序是:测试之前会执行编译,打包之前会执行测试,安装之前会执行打包。

  但是这种编译-测试-打包的jar包,即使有main函数,也是无法点击运行的,换句话说:默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF、MANIFEST.MF文件,将无法看到Main-Class一行)。因此为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.4.3</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

注意:其中只需要更改的是mainClass元素下的主函数的全路径。
如果出现《maven打包maven-shade-plugin报错Non-parseable POM》错误可以参考:

http://blog.csdn.net/fanxiaobin577328725/article/details/53053995#t7

3.5 使用Archetype生成项目骨架

  我们手工创建上面的结构,会感觉很繁琐,Maven提供了Archetype来帮助我们快速勾勒出项目骨架。特别是使用IDE创建Maven的时候肯定会见到这个词汇,因为IDE就是调用Archetype来生成Maven项目的。

  我们只需要使用mvn archetype:generate命令就会可以根据提示一步步创建一个Maven项目了,其实就是提示一步步输入pom配置文件的必要内容。在IDE中就更为简单了,现在主流的IDE都集成了,有的书上说在Eclipse中需要安装m2eclipse,但是我使用的Eclipse中就可以直接使用,所以看情况。

四、Maven目录结构

官网资料:Introduction to the Standard Directory Layout

src/main/javaApplication/Library sources
src/main/resourcesApplication/Library resources
src/main/resources-filteredApplication/Library resources which are filtered. (Starting with Maven 3.4.0, not yet released.)
src/main/filtersResource filter files
src/main/webappWeb application sources
src/test/javaTest sources
src/test/resourcesTest resources
src/test/resources-filteredTest resources which are filtered by default. (Starting with Maven 3.4.0, not yet released.)
src/test/filtersTest resource filter files
src/itIntegration Tests (primarily for plugins)
src/assemblyAssembly descriptors
src/siteSite
LICENSE.txtProject's license
NOTICE.txtNotices and attributions required by libraries that the project depends on
README.txtProject's readme

  At the top level files descriptive of the project: a pom.xml file In addition, there are textual documents meant for the user to be able to read immediately on receiving the source: README.txt, LICENSE.txt, etc.(放在顶层的文件除了pom.xml文件还有README.txt, LICENSE.txt等)

  There are just two subdirectories of this structure: src and target. The only other directories that would be expected here are metadata like CVS, .git or .svn, and any subprojects in a multiproject build (each of which would be laid out as above).(Maven项目有两个子目录:src和target。)

  The target directory is used to house all output of the build.(target目录被用来存放所有build的输出文件)
  The src directory contains all of the source material for building the project, its site and so on. It contains a subdirectory for each type: main for the main build artifact, test for the unit test code and resources, site and so on.(src目录包含所有的源文件,其包含两个子目录:main与test,test是测试源文件;main是主要的构建源文件)
  Within artifact producing source directories (ie. main and test), there is one directory for the language java (under which the normal package hierarchy exists), and one for resources (the structure which is copied to the target classpath given the default resource definition).
  If there are other contributing sources to the artifact build, they would be under other subdirectories: for example src/main/antlr would contain Antlr grammar definition files.

maven官方文档: war的项目目录结构和war包目录结构

疑问:使用eclipse创建的maven-archetype-webapp创建项目,只包含src/main/webapp,并没有其它文件夹?

  经过尝试,我们只需要按照上面的结构与约定创建普通文件夹,其都会被转换为相应的源文件夹(Source Folder)。

补充:maven依赖本地非repository中的jar包

有一些遗留项目,要转到maven管理,但又因为是多人分布式开发,不好建本地仓库,不得已只能把几个包放到了WEB-INF/lib下,但是通过通常的方法去依赖这些包,在maven install的时候是会报错的,说找不到这些包,所以要通过一些配置来处理。
有两种方式:
1. 通过scope指定为system

<dependency>   
    <groupId>org.apache</groupId>    
    <artifactId>test</artifactId>   
    <version>1.0</version>   
    <scope>system</scope>   
    <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/test.jar</systemPath>   
</dependency>

2. 通过maven插件里面配置

 <build>  
    <plugins>  
        <plugin>  
          <artifactId>maven-compiler-plugin</artifactId>  
          <configuration>  
              <source>1.6</source>  
              <target>1.6</target>  
              <encoding>UTF-8</encoding>  
              <compilerArguments>  
               <extdirs>src\main\webapp\WEB-INF\lib</extdirs>  
             </compilerArguments>  
          </configuration>  
        </plugin>  
    </plugins>  
</build>  

参考资料:

赞赏

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页