Idean中的Maven

2022-11-22 15:11:26 浏览数 (1)

1. Maven介绍:

maven最主要体现在两个词上:项目和管理。maven给我们整个开发团队找出了一种能够更加科学的去管理我们项目的思想。maven通过使用配置文件的方式使得项目在管理和交接的过程中成本变得非常低。maven提出了一种叫做maven仓库的概念,使得我们可以将第三方和我们需要引用的项目都放置在maven仓库当中。如果其他人或项目组也需要使用,就可以直接通过maven进行配置就行。这样就可以将人员成本、沟通成本等等都进行降低。 如果还不理解我们举个例子: 加入我们现在想做一份菜:糖醋排骨。如果我们想要做这道菜,那么我们首先要先去菜市场买排骨、糖、醋、......,而且在做的时候还要注意使用糖醋的用量等等。那么如果有一个超市,该超市有卖糖醋排骨的料理包,这是不是就能很大的节省我们做饭和买菜的时间开销。其实maven就是这个卖料理包的超市,当人卖的不是料理包,而是一系列的jar包。这样我们在写代码的时候就不需要去其他网站上下载一大堆的jar包。

简单来说Maven是: Apache Maven是个项目管理和自动构建工具,基于项目对象模型(POM)的概念。    作用:完成项目的相关操作,如:编译,构建,单元测试,安装,网站生成和基于Maven部署项目。

2. 什么是自动构建工具?

构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从以下三个层面来看:

①纯Java代码 大家都知道,我们Java是一门编译型语言,.java扩展名的源文件需要编译成.class扩展名的字节码文件才能够执行。所以编写任何Java代码想要执行的话就必须经过编译得到对应的.class文件。 ②Web工程 当我们需要通过浏览器访问Java程序时就必须将包含Java程序的Web工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。 我们可以将未编译的Web工程比喻为一只生的鸡,编译好的Web工程是一只煮熟的鸡,编译部署的过程就是将鸡炖熟。 Web工程和其编译结果的目录结构对比见下图:

③实际项目 在实际项目中整合第三方框架,Web工程中除了Java程序和JSP页面、图片等静态资源之外,还包括第三方框架的jar包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。 所以综上所述:构建就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、JSP页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。 那么项目构建的全过程中都包含哪些环节呢?

2.3 构建环节

①清理:删除以前的编译结果,为重新编译做好准备。 ②编译:将Java源程序编译为字节码文件。 ③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。 ④报告:在每一次测试后以标准的格式记录和展示测试结果。 ⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。 ⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。 ⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

2.4 自动化构建

其实上述环节我们在Eclipse中都可以找到对应的操作,只是不太标准。那么既然IDE已经可以进行构建了我们为什么还要使用Maven这样的构建工具呢?我们来看一个小故事:

这是阳光明媚的一天。托马斯向往常一样早早的来到了公司,冲好一杯咖啡,进入了自己的邮箱——很不幸,QA小组发来了一封邮件,报告了他昨天提交的模块的测试结果——有BUG。“好吧,反正也不是第一次”,托马斯摇摇头,进入IDE,运行自己的程序,编译、打包、部署到服务器上,然后按照邮件中的操作路径进行测试。“嗯,没错,这个地方确实有问题”,托马斯说道。于是托马斯开始尝试修复这个BUG,当他差不多有眉目的时候已经到了午饭时间。 下午继续工作。BUG很快被修正了,接着托马斯对模块重新进行了编译、打包、部署,测试之后确认没有问题了,回复了QA小组的邮件。 一天就这样过去了,明媚的阳光化作了美丽的晚霞,托马斯却觉得生活并不像晚霞那样美好啊。

让我们来梳理一下托马斯这一天中的工作内容

从中我们发现,托马斯的很大一部分时间花在了“编译、打包、部署、测试”这些程式化的工作上面,而真正需要由“人”的智慧实现的分析问题和编码却只占了很少一部分。

能否将这些程式化的工作交给机器自动完成呢?——当然可以!这就是自动化构建。

那么Maven又是如何实现自动化构建的呢?简单的说来就是它可以自动的从构建过程的起点一直执行到终点:

 *.java->*.class->run       方式一       javac  HelloWorld.java       java HelloWorld       方式二       开发工具Eclipse

3. 常用的自动构建工具

1.java平台常用的构建工具之Ant.         Ant 是由 Java 编写的构建工具,它的核心代码是由Java编写的,因此具有平台无关性,构建脚本是XML格式的(默认为bulid.xml)。 例如:下面列出一个ant工具所使用的build.xml:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" ?>  
<project name="HelloWorld" default="run" basedir=".">  
<property name="src" value="src"/>  
<property name="dest" value="classes"/>  
<property name="jarfile" value="hello.jar"/>  
<target name="init">  
   <mkdir dir="${dest}"/>  
</target>  
<target name="compile" depends="init">  
   <javac srcdir="${src}" destdir="${dest}"/>  
</target>  
<target name="build" depends="compile">  
   <jar jarfile="${jarfile}" basedir="${dest}"/>  
</target>  
<target name="test" depends="build">  
   <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>  
</target>  
<target name="clean">  
   <delete dir="${dest}" />  
   <delete file="${hello_jar}" />  
</target>  
</project> 

ant的构建脚本还是比较清楚的。ant定义了五个任务,init, compile, build, test, clean。每个任务做什么都定义清楚了。 打包之前要先编译,所以通过depends来指定依赖的路径。如果在命令行里执行ant build,那就会先执行compile,而compile又依赖于init,所以就会先执行init。有了这个东西以后,我们只要一条命令:ant test 就可以执行编程,打包,测试了。为开发者带来了很大的便利。 但是ant有一个很致命的缺陷,那就是没办法管理依赖。我们一个工程,要使用很多第三方工具,不同的工具,不同的版本。 每次打包都要自己手动去把正确的版本拷到lib下面去,这个工作既枯燥还特别容易出错。为了解决这个问题,maven登场了。

2、java平台常用的构建工具之maven.

Maven作为后来者,继承了Ant的项目构建功能,同样采用了XML作为构建脚本的格式。Maven具有依赖管理和项目管理的功能,提供了中央仓库,能帮助我们自动下载库文件。 maven最核心的改进就在于提出仓库这个概念。我可以把所有依赖的包,都放到仓库里去,在我的工程管理文件里,标明我需要什么什么包,什么什么版本。 在构建的时候,maven就自动帮我把这些包打到我的包里来了。我们再也不用操心着自己去管理几十上百个jar文件了。这了达到这个目标,maven提出,要给每个包都标上坐标,这样,便于在仓库里进行查找。 所以,使用maven构建和发布的包都会按照这个约定定义自己的坐标,例如:

代码语言:javascript复制
<?xml version="1.0" encoding="utf-8"?>
<project ...xmlns...>
    <groupId>cn.hinus.recruit</groupId>
    <artifactId>Example</artifactId>
    <version>0.1.0-SNAPSHOT</version>
         
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>
</project>

这样,就定义了包的坐标是cn.hinus.recruit:Example:0.1.0-SNAPSHOT,而我的工程要依赖junit:junit:4.10。那么maven就会自动去帮我把junit打包进来 。如果我本地没有junit,maven还会帮我去网上下载。下载的地方就是远程仓库,我们可以通过repository标签来指定远程仓库。 maven里抛弃了ant中通过target定义任务的做法,而是引入了生命周期的概念。

maven的缺点有: maven是使用xml进行配置的,语法不简洁。 maven在约定优于配置这条路上走太远了。就是说,maven不鼓励你自己定义任务,它要求用户在maven的生命周期中使用插件的方式去工作。这有点像设计模式中的模板方法模式。 说通俗一点,就是我使用maven的话,想灵活地定义自己的任务是不行的

3.java平台常用的构建工具之Gradle. gradle充分地使用了maven的现有资源。继承了maven中仓库,坐标,依赖这些核心概念。文件的布局也和maven相同。但同时,它又继承了ant中target的概念,我们又可以重新定义自己的任务了。 Gradle不用XML,它使用基于Groovy的专门的DSL或者或Kotlin DSL,从而使Gradle构建脚本变得比用Ant和Maven写的要简洁清晰。 Gradle样板文件的代码很少,这是因为它的DSL被设计用于解决特定的问题:贯穿软件的生命周期,从编译,到静态检查,到测试,直到打包和部署。Google采用Gradle作为Android OS的默认构建工具。

代码语言:javascript复制
// Apply the java plugin to add support for Java
apply plugin: 'java'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use 'jcenter' for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

// In this section you declare the dependencies for your production and test code
dependencies {
    // The production code uses the SLF4J logging API at compile time
    compile 'org.slf4j:slf4j-api:1.7.21'

    // Declare the dependency for your favourite test framework you want to use in your tests.
    // TestNG is also supported by the Gradle Test task. Just change the 
    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add 
    // 'test.useTestNG()' to your build script.
    testCompile 'junit:junit:4.12'
}

4. Maven安装与配置 

 4.1 下载maven安装包,解压即可使用(3.6.0)       http://maven.apache.org/download.cgi   4.2 配置maven环境变量     4.2.1 MAVEN_HOME     4.2.2 M2_HOME     4.2.3 修改path添加maven相关路径           配置方式跟jdk有些类似,环境变量MAVEN_HOME和M2_HOME的值为maven的根目录、           然后在PATH环境变量里加入“%MAVEN_HOME%bin;%M2_HOME%bin;”即可 4.3 验证       doc窗口执行命令“mvn –version”  4.4 修改“MAVEN_HOMEconf”下的setting.xml文件,配置本地仓库。注意是:“E:/”而非“E:”   例如:<localRepository>E:/mvn-repository</localRepository>   注1:<localRepository>标签在setting.xml文件的53行       注2:仓库的作用就是用来存放jar包的       注3:仓库的分类            中央仓库(默认是国外的源,换成国内的阿里巴巴的源,速度更快) https://mvnrepository.com/  公司仓库(也叫私人仓库或私服)            本地仓库          公司里面还会有一个大仓库(本地)全公司使用           本地仓库程序员自己使用,私服全公司使用,中央仓库所有人用 中央仓库(http://search.maven.org/,但一般使用另外一个网站:http://www.mvnrepository.com/) 注4:jar的查找顺序:本地仓库->私服->中央仓库                          CDN服务       注5:换源“阿里云” 为什么需要私服            如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,    而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,    还会影响项目的进程。很多情况下项目的开发都是在内网进行的,连接不到maven仓库怎么办呢?    开发的公共构件怎么让其它项目使用?这个时候我们不得不为自己的团队搭建属于自己的maven私服,    这样既节省了网络带宽也会加速项目搭建的进程,当然前提条件就是你的私服中拥有项目所需的所有构件   4.5 maven插件安装与配置     注意:eclipse中的maven配置与eclipse的工作空间有关!       注1:eclipse4.0以上已经安装好了,无需额外配置       注2:设置maven安装路径            Installations       注3:指定setting.xml文件            User Settings Maven用户可以选择配置$M2_HOME/conf/settings.xml或者~/.m2/settings.xml,前者是全局范围的,            整台机器上的所有用户都会直接受到该配置的影响,而后者是用户范围的,只有当前用户才会受到该配置的影响。            推荐使用用户范围的setting.xml,主要是为了避免无意识地影响到系统中的其他用户,            而且为了以后maven升级的方便,直接把配置文件从仓库拷过去就可以了。 eclipse:基于workspace工作空间,一个工作空间里面可以包含多个项目   idea   :基于project工程,一个工程里面包含多个模块(module)

 5. Maven的使用1:创建java项目

  Maven project    maven-archetype-quickstart    group id:组织id,一般就是公司域名反写    artifact id:项目名字    version:版本    package:java包名    src/main(源代码)    src/test(测试代码)    target     编译后、打包后的文件

6. Maven的使用2:创建web项目

 Maven project    maven-archetype-webapp  注1:加入servlet api,不然报错    注2:修改Project Facets          web2.3->web2.5       jdk1.5->jdk1.8    注3:添加的配置archetypeCatalog=internal可加快项目创建速度      archetypeCatalog用来指定maven-archetype-plugin读取archetype-catalog.xml文件的位置:     internal——maven-archetype-plugin内置的     local——本地的,位置为~/.m2/archetype-catalog.xml     remote——指向Maven中央仓库的Catalog

 7. maven打包    maven install 8. 什么是POM

   Project Object Model,项目对象模型。    通过xml格式保存的pom.xml文件。作用类似ant的build.xml文件,功能更强大。    该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。    最后,根据你的项目需要更新您的pom.xml

代码语言:javascript复制
<dependencies>
     <!--英语解释:依赖,专业解释:坐标-->
     <!--  E:/mvn-repository/junit/junit/3.8.1.jar -->
     <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
   </dependencies>

 struts2 pom.xml

   网址:www.mvnrepository.com    在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:      * compile,缺省值,适用于所有阶段,会随着项目一起发布。      * provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。      * runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。      * test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。      * system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

0 人点赞