Maven从入门到精通,看这一篇就足够了

Maven是一种帮助我们快速构建项目的小工具,它可以解决我们在项目过程中手动导包造成的版本不一致的问题,以及找包困难等问题,同时通过Maven创建的项目都有固定的目录格式,使得约定优于配置,我们通过固定的目录格式快速掌握项目

一.首先介绍项目的目录结构

.settings文件暂时不讲

Src目录由名字可知其主要存放的是源代码文件,源代码的文件目录中可以发现有两个文件目录,分别是以下

其中main存放的是我们经常存放用于运行项目的代码,main再下一级的目录就是各种package,而test则是存放用于用于测试项目的测试代码,同时都拥有resource资源文件

target目录下的class目录则是存放编译后的代码

pom.xml文件便是资源文件,确定该项目需要使用哪些jar包的坐标,并通过该坐标在中央仓库进行自动下载。

  • 使用Maven插件的前提

在使用maven插件的时候,先要确定jdk和maven是否已经安装,可以通过以下命令确定

  通过java -version确定JDK是否安装

 通过mvn -version确定maven是否安装

若JDK或者Maven没有安装,安装也很简单,在计算机的Path环境下,设置两个环境变量,分别是JAVAHome和MavenHome,分别指向JDK和Maven的安装目录即代表安装成功这时可以通过以下指令,查找是否有对环境变量进行设置

在之后就是尝试访问maven的中央仓库,若无法访问则说明不能自动下载jar包,

通过指令ping repol.maven.org确定是否能访问,若不能则需要设置http代理

在maven的安装包的setting.xml文件中设置代理

 

  • Maven安装目录分析

 Maven的目录如下:

其中bin存放的是maven的启动文件,包括两种,一种是直接启动,另一种是通过debug模式下启动,发现它们之间的差距就差一条指令而已

Boot存放的是一个类加载器框架,它不依赖于eclipse的类加载器

Conf 主要存放的是全局配置文件setting.xml,通过它进行配置的时候,即所有仓库都拥有的配置,仓库自身也拥有setting.xml这个为私有配置,一般推荐使用私有配置,因为全局配置是存在于maven的安装目录中,当进行Maven升级的时候,便要进行重新的配置

lib存放的是maven运行需要的各种jar包

License是Maven的软件使用许可证书

NOTICE 是Maven包含的第三方软件

README.txt是Maven的简单介绍以及安装说明

 

有些公司不允许访问中央服务器下载jar包,而是提供一个代理的网站,通过这个代理ip去下载jar包,这个设置是在setting.xml文件上进行设置,具体设置如下(备注:在proxies上可以设置多个代理即《proxy》多个,只有第一个被激活的生效

  <proxy>

      <id>optional</id>    //代理Id

      <active>true</active>   //是否要激活

      <protocol>http</protocol>  //采用协议

      <username>proxyuser</username>   //如果代理需要认证就需要账号密码

      <password>proxypass</password>

      <host>proxy.host.net</host>  // ip

      <port>80</port>   //端口

      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>  //不需要代理的主机ip用户|隔开,例如里面的some.host.com,即所有对这个网站的访问都不需要代理

</proxy>

 

 

为什么有时候在Eclipse上使用maven building时候会出错,因为Eclipse默认运行在JRE上面了,而maven building需要使用到jdk的功能所以会出错,将Eclipse设置默认运行在JDK上就可以了

 

运行Maven 命令其实就是运行java命令,所以maven的使用,需要用的jdk环境,有时候需要设置JVM参数的的时候,可以在mvn.bat等执行脚本上修改,但这样太麻烦了,一旦升级的时候就得设置,这时候可以把Jvm参数设置在环境变量MAVEN_OPTS中,其设置方式跟设置MAVEN_HOME是一样的

 

  关于setting.xml的问题,一般可以分成两类,一类是公共配置setting.xml,它是存放在maven的安装目录上的conf中,一种是私有配置,存放在.m2的仓库中,里面存放的都是maven的配置,一般来说推荐公共配置在安装目录中,私有配置在仓库中存放,如果是使用私有配置的话,maven升级就不会影响到自己之前的配置了,所以优先使用私有配置

 

使用eclipse内嵌的maven容易出现不稳定的情况,可以手动安装外部的maven,在eclipse上的preferences上的maven选项里的Installation,点击add,选择你下载的maven安装包

 

 

四.手写Maven项目:

  1. 编写pom文件

<project          //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>   //指定当前pom模型的版本,maven2 和3都是4

  <groupId>com.juvenxu.mvnbook</groupId>   //定义项目是哪个公司哪个部门组(项目)的

  <artifactId>hello-world</artifactId>  //组内的唯一id(例如项目中的哪个组件)

  <version>0.0.1-SNAPSHOT</version>   //项目当前版本,SNAPSHOT为不稳定版本,该项目依旧处于快速开发中

  <name>Maven Hello World Project</name>  //项目别名,不一定用,用于方便对外交流

</project>

Pom文件可以用于解耦,最大程度区分项目与项目之间的区别

 

  1. 编写主代码

Maven项目的主代码一般是位于/src/main/java目录中,我们遵循Maven的规定,创建类HelloWorld.java

关于JAVA代码编写的两个注意点:

1.默认将代码存放到src/main/java中,Maven会自动在该目录上搜索主代码

2.包名的命名格式要遵循groupid + arafitid的格式,这样更清晰,更符合逻辑

 

  1. 代码编写完后在项目的根目录上使用MAVEN进行编译,在根目录上使用命令

mvn clean compile

 

在这里clean是清除当前目录的target/目录,然后编译项目的主代码,target/存放着maven项目的主输出,,先执行clean后再执行compile,编译好的字节码文件存放在target/classes目录中

 

  1. 编写测试代码

为了将测试代码和主代码区分开,其应该存放在不同的的目录,主代码是存放在src/main/java,而测试代码是存放在src/test/java的目录中,所以在编写代码之前应该是先创建目录

在这里是使用单元测试junit测试,所以要往项目添加junit的依赖包,在pom中添加这几行代码

<dependencies>

      <dependency>

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>4.7</version>

           <scope>test</scope>

      </dependency>

  </dependencies>

<dependencies></dependencies>中存放着所有依赖包的描述,<dependency>是对单个依赖包的信息描述,也就是提供下载的坐标,maven通过该坐标在中央仓库中下载该Jar包,中央仓库的位置在setting.xml中有进行配置,通过这种配置我们就能轻松下载的jar包junit-4.7.jar,在这里我们注意到多了一个标签是<scope>,该标签是来注明Jar包使用的范围,在这里写test的话,则在测试代码中使用import Junit是可以的,在主代码中使用会,会出现找不到该jar包的提示信息,若不写这个标签,则默认使用范围是compile,则测试代码和主代码都可以使用该代码

 

开始写测试代码:测试主代码中的HelloWorld类的sayHello方法,检查其返回值是否为Hello World,所以在src/test/java下创建测试文件,编写好的测试文件如下

 

使用junit需要注意的是所有测试方法都是用test作为开头,同时都要添加注解@Test

 

运行测试代码,使用命令 mvn clean test ,在这里测试成功了,结果如下

 

 

备注

在这里的mvn clean test包含两个命令,分别是mvn clean和 mvn test,test又分为两个命令,一个是mvn compile:testCompile 和 mvn surefire : test,测试后发现 mvn surefire:test是可用的,另一个命令没法用,以后再分析

 

  1. 将项目进行打包,主代码打包后的名字为hello-world-1.0-SNAPSHOT.jar文件,该文件依旧存放在target中,所以target存放着项目的所有输出,使用的命令是mvn clean package,执行结果如下

 

可以在项目的target文件中查看到该jar包

 

当然可以使用finalName来重新定义jar包的名称,具体操作自行百度,有了该jar包后,,可以啊添加到其他项目的classpath中直接使用,而如何让其他maven项目能快速使用呢?这里就可以用到一个命令是mvn install,将jar包安装在Maven的本地仓库中,使用到的指令是mvn clean install,通过日志可以发现该jar已经发送到本地仓库那里了

 

 

在这里先做一下总结:在执行test命令之前,Maven会默认执行compile命令,,在执行package之前,maven会默认先执行test命令,在执行install时,mvn会先执行package命令

到这里基本的mevan操作可以说是完成了,但你没发现这些jar包都是没法运行的,但我的helloWorld类是有main()类、,如果我希望我的jar包可运行应该是如何。

具体操作如下:为了生成了执行的jar文件,需要借助maven -shade-plugin,需要在pom.xml文件下进行配置,配置该插件的位置应该在<project> <build> <plugins>下面,配置的代码如下:

<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>org.sonatype.haven.HavenCli</mainClass>

                </transformer>

              </transformers>

            </configuration>

          </execution>

        </executions>

      </plugin>

    </plugins>

  </build>

原生的jar文件无法执行是因为打包后的jar文件里面的META-INF/MANIFEST.FE文件无法看到Main-Class一行,采用这个插件就可以添加这一行,生成后会出现两个文件

 

没加originald的就是可执行文件jar,original是原来的不可执行文件

 

然后我们现在尝试执行jar包看看结果

使用java指令

java -jar target\hello-world-0.0.1-SNAPSHOT.jar

运行结果如下

 

 

到这里,基本的maven项目存放的文件规范基本清楚了,一个maven项目有src目录存放代码,和pom.xml文件,如果每次使用maven项目,都需要这样创建就很麻烦了,maven提供了一个快速创建Maven目录结构的指令

使用指令 mvn archetype:generate 该指令能快速生成maven项目,在创建的过程会询问你要填写的项目信息,例如 groupId   artifactId 等

 

关于在Eclipse上如何使用指令:对着项目点击右键run,里面就有着好几个maven指令,当我们找不到需要使用的指令,便可以通过maven build来执行我们想要执行的Maven指令

 

 

 

 

Maven包通过坐标来定义jar包的位置,间接依赖是指依赖的jar包内部依赖其他jar,在导入依赖jar包的时候,会再导入其他依赖的jar,至于依赖链,我感觉不太需要就不做分析

 

 

Maven仓库

 在Maven世界中,任何一个依赖、插件或者项目构建的输出都可以称为一个构件,在以前的项中,我们往往会将项目依赖的jar包都存放在项目的lib文件夹,如果多个项目都有相同的jar,会大大增加磁盘的浪费,而maven中使用的jar包依赖方式,都是基于坐标,所以Maven会为所有的本地maven项目建一个仓库,该仓库的位置存放在setting.xml上面,当maven项目需要使用到这些jar包时,通过jar包的坐标,在本地仓库中查找到该jar包,在编译时使用到它

jar在本地仓库存放的路径一般是groupId + artafitID ,jar包名字为araftId + version +package

 

仓库分类

加入jar在本地仓库中找不到的时候,就在远程仓库查找,若还是找不到,就会自动报错,仓库分两种,一种是中央仓库,所有人都可以使用,一种是私服仓库,是在局域网中搭建,用其代理从中央仓库下载jar包,也可以支持项目部署到上面

 

本地仓库分析

一般仓库存放的路径是user目录下的.m2的repository下面,若修改位置就在settin.xml上的loaclrepository中,在这里我们可以将我们的项目发布到本地项目上,通过mvn clean install就可以,然后在其他项目中想要使用它就可以通过坐标去下载它

 

中央仓库:中央仓库便是若是在本地找不到jar包,Maven便会在中央仓库查找,每一个Maven都至少有一个中央仓库,其位置是在lib中

 

 

可以在自己的项目的pom.xml文件中设置要访问的远程仓库

 

 

Maven生命周期

 

什么是Maven生命周期?

对项目构建过程进行抽象,其中就包括了项目的清理 初始化 编译 测试 打包 集成测试 验证 部署和 站点生成等所有构建步骤,Maven的生命周期模型本身是不做任何实际的工作,其各种各样的实现任务都是由插件实现,这种设计思想与模板设计模式十分相似,,在父类中定义了算法的总体架构,而算法细节由插件负责实现

 

Maven的任何功能都是由插件构成的,它的生命周期有三个,分别是clean site defautlt,这三个生命周期都是由插件完成工作, 当我们使用maven的使用感觉好像没使用插件,是因为这些插件是内置的,我们无法看到

  • 23
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值