HELLO!大家好!这是咕噜的第一篇博客,还请前辈们多包涵!!咕噜大大,专注编程和单身30年!

       尊重原创,请大家转载时注明该文章来自:

       正如大家所知的,maven是Apache底下的一个项目构建和管理工具,主要的功能有项目中依赖的jar包管理,项目的构建(build),清理,编译,打包部署,运行测试用例,生成报告和文档,软件配置管理,发布管理等等(要活用“等等”这个词,当你不知道这玩意还有什么功能时,写上“等等”,就会显得很专业的赶脚

)。在构建JavaEE项目时,很多人的第一反应就是要上SSH框架,因为上框架能实现项目的工业化开发,提高代码的复用性和可维护性,解耦合,方便模块化层次化开发,好处自然不言而喻。但问题就在于要使用这些框架,就得往项目中下载不同的依赖包,哪怕是只使用最基本的3个框架功能:数据库持久化+依赖注入+前端控制,也需要下载20多个jar包,不光名字难以记全,还可能因为版本不一致的问题导致jar冲突,这对开发人员来说简直是一个噩梦!所以,这时候就要请ApacheMaven出马了,maven提倡一个理念:约定大于配置(Convention Over Configuration),只要你遵守maven的项目配置约定(比如说:创建的项目目录结构得是:/src/main/java),就只用在pom.xml中填写少量的配置,maven便能帮你把项目自动管理起来,下载依赖包,清理构建部署等等,十分方便!

下载安装maven

         maven是一个Java工具,所以使用maven之前必须要在系统中安装JDK。

         maven的官方下载传送门:http://maven.apache.org/download.cgi

         将下载下来的bin tar.gz文件解压缩并放在你想要的目录下,目前最新的maven版本是3.2.5.

         接下来在你的mac操作系统中打开命令行终端,并在里面添加一个maven2文件bin目录地址的变量:

export M2=/your/path/apache-maven-3.2.5/bin
         然后将刚刚的地址变量加入到系统中的path环境变量里, 并输出在bash_profile文件里
echo "export PATH=$M2:$PATH" >> ~/.bash_profile
bash_profile
    没报错的话,最后运行
    >>mvn --version

    如果出现下面的内容,恭喜你已经成功安装maven2在你的mac系统上了。

   

Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /Users/apple/Documents/apache-maven-3.2.5
Java version: 1.6.0_65, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: zh_CN, platform encoding: EUC_CN
OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac"



创建maven项目

      在maven中使用archetype机制去构建一个项目,archetype是一个通用的maven项目的模板管理工具,用户也可以通过archetype为自己的EJB,SPRING项目建立模板。

        打开你的命令行并使用archetype命令去创建一个符合maven约定的项目。

        >>mvn -B archetype:generate  -DarchetypeGroupId=org.apache.maven.archetypes  -DgroupId=com.guludada.maven -DartifactId=my-maven

        第一次创建可能时间会比较久,因为会下载许多依赖包。 DarchetypeGroupId是该模板所属的机构(group);DgroupId是你自己的项目所属的机构,使用倒叙域名的写法;DartifactId是你项目的名称; (其中“archetype:create”已不推荐使用)

        在当前目录下,archetype就会创建如下目录结构的maven项目:

     

--my-maven
           --pom.xml
           --src
              |--main
                  --jave
                     --com
                        --guludada
                           --maven
                              --App.java
               |--test
                   --java
                     --com
                        --guludada
                           --maven
                              --AppTest.java


      一个标准的maven项目目录结构中,包含一个pom.xml文件,以及项目业务源码的存放目录${DartifactId}/main/java和测试源码的存放目录${DartifactId}/test/java

      同时,你还可以使用 “-DarchetypeArtifactId=${template_name}”指定模板去创建maven项目,默认情况下,如果不明确指明用哪个模板去创建项目,系统会使用“-DarchetypeArtifactId=maven-archetype-quickstart”模板去创建项目,如上所示;如果你想创建一个webapp项目,你可以在使用archetype命令时明确指出:“-DarchetypeArtifactId=maven-archetype-webapp”,或者你也可以自定义自己的archetype模板。

      maven的核心:pom.xml

       在maven工程下,你会看见pom(Project Object Model)文件,它是maven项目的核心也是最本的maven元素。pom文件记录着关于项目的信息以及被maven用来构建项目的配置。一个基本的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.guludada.maven</groupId>
  <artifactId>my-maven</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-maven</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>



“<project>”是pom.xml的顶级元素。

“<modelVersion>”是指当前pom的版本,一般就默认配置就好了

"<groupId>"是指这个项目创建者的ID,一般就是公司域名的倒叙,如:com.guludada

"<artifactId>"是指这个项目产生的可运行软件的名称,并遵循<artifactId>-<version>.<extension>的格式,如上maven产生的jar包名就是:my-maven-1.0.jar

"<packaging>"是指项目打包的格式,如:jar,war,ear等,默认情况下是jar

"<version>" 指的是该项目的版本,maven有自己的一套项目版本管理机制,如上所示-snapshot的指示符标明该项目处于开发阶段

"<name>"指的是该项目的名称,通常被用在maven生成的文档中

"<url>"指的是该项目部署的域名,通常被用在maven生成的文档中


一个最轻量最基本的pom文件必须包含:“<project>”,“<modelVersion>”,"<groupId>","<artifactId>","<version>"这5个元素。

同时,所有项目的pom文件都会继承一个父类pom文件:super pom,如下所示:

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>Maven Default Project</name>

  <repositories>
    <repository>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <layout>default</layout>
      <url>http://repo1.maven.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <finalName>${artifactId}-${version}</finalName>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
      </testResource>
    </testResources>
  </build>

  <reporting>
    <outputDirectory>target/site</outputDirectory>
  </reporting>

 ……………………………………

</project>

上面的super pom只列了一部分内容,主要是要让大家看“<build>”元素中的内容

<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>

这里就约定了maven的目录结构是:src/main/java的结构,所以没有什么类似不改会死的需求的话,就不要去改这个maven约定的项目目录结构了,毕竟是很多开发人员总结出来的项目目录结构。

  Maven2的包管理

  最为大家熟悉的就是Maven的包管理机制了,只要配置好pom.xml文件,maven就会自动帮你下载管理项目所需要用的依赖包。构建项目时,maven会先去~/.m2/repository下寻 找项目中需要用到的依赖包,如果没有的话,maven就会去远程库(http://repo.maven.apache.org/maven2/)中下载依赖包到本地中来。

  

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.guludada.upload</groupId>
  <artifactId>my-UploadWeb</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-UploadWeb Maven Webapp</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>
  <build>
    <finalName>my-UploadWeb</finalName>
  </build>
</project>



如上所示,只要在pom.xml根据项目需要,使用“<dependencies>”标签添加要依赖的jar包库信息,maven就会帮你自动将jar包管理起来。

“grouid”,“artifactid”和“version”和之前提到的含义是相同的,这里多了一个“<scope>”标签,这个scope标签是指明项目在什么时候使用这些依赖包,默认下是“compile”,这里是指定为“test”,意思就是只有当项目的测试模块编译和运行时才使用这个junit依赖包。


无图无真相,无例无内涵

   这里通过一个简单的例子来演示如何用maven构建你的项目。

   首先打开命令行,用archetype来构建maven项目,并且指定“-DarchetypeArtifactId=maven-archetype-webapp”,这样创建的maven项目目录下面就会有一个webapp的目录

   >>mvn -B archetype:generate  -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.guludada.upload   -DartifactId=my-UploadWeb

    然后使用Eclipse的"File"-->"Import"功能将刚刚创建好的maven项目导进来,选择“Existing Maven Projects”

mac 下载多个版本的maven_maven


   可以看见导入刚刚创建好的maven项目后的目录结构如下图所示:


mac 下载多个版本的maven_mac 下载多个版本的maven_02

我们会发现刚创建的maven项目报错了,没关系,我们现在来解决。从项目错误来看,提示的是找不到“javax.servlet.http.HttpServlet”找不到。首先右键点击项目,并选择“Properties” --> "Project Facets", 你会看见Eclipse自动为你勾选了 “Dynamic Web Module” 模板,所以项目中必须要有servlet-api的jar包,而servlet一般由容器生成,所以我们这时候要去检查TOMCAT的jar包有没有导入到项目中来。

mac 下载多个版本的maven_library_03


接下来,选择“Java Build Path”,我们会看见里面的“Libraries”选项卡中只有“JRE System Libraries”和“maven dependencies”两个jar包库,这是远远不够的;需要点击右边的“Add Library”按钮,选择添加“Server Runtime”(Tomcat的lib库),“Web App Libraries”和“EAR Libraries”(企业级应用EJB的依赖库)3个jar包库;

mac 下载多个版本的maven_library_04


   添加完依赖包后,你会发现Eclipse自动帮你构建了“src/main/java”文件目录。右键点击项目,选择“Properties”-->"Deployment Assembly",如果里面没有“Maven Dependencies”,则需要点击右边的“add…”-->"Java Build Path Entries"-->"Maven Dependencies"添加进去。

mac 下载多个版本的maven_mac_05


这时候一个完整的maven web项目就构建完成了,之前的错误也消失了,可以开始实现上传文件的程序了。(如果仍然报错,可以右键点击项目选择“Validate”,就会好了)

最后一步就是要在pom文件中中配置该项目要使用到的依赖包(通过“<dependency>”标签),并点击保存(或打开命令行输入mvn compile),那么maven就会从远程依赖库中下载该项目要用到的依赖包到本地依赖库中。

mac 下载多个版本的maven_maven2_06

这样一个完整的maven项目就算构建完成了。接下来开始写业务代码吧。

很多朋友会问到,这里maven的目录结构为src/main/java/com/guludada/UploadWeb或"src/main/webapp",我们在配置web.xml文件或者在servlet中写要调用的jsp或servlet的地址,是不是要写全maven的目录结构?答案是否定的!!右键点击项目,选择“Properties”-->"Deployment Assembly",你会发现“src/main/java”目录下的文件都直接构建在WEB-INF/classes目录下,所以在web.xml配置文件下,就像平常那样在“<servlet-class>”标签里直接写上“com.guludada.uploadApp.app”,而不用再写上”src/main/java“目录了。同理,“src/main/webapp”下的文件全部构建在“/”目录下,所以在servlet中调用jsp时,直接写上“request.getRequestDispatcher("index.jsp").forward(request, response)”就可以了,而不用再带上“request.getRequestDispatcher("src/main/webapp/index.jsp").forward(request, response)”前缀地址。

mac 下载多个版本的maven_mac 下载多个版本的maven_07

mac 下载多个版本的maven_maven_08

         小技巧

${user.home}/.m2/settings.xml中自定义你某个项目里远程仓库的镜像,而不用改变原有项目的pom文件。其中<mirrorOf>和pom文件中<repository>标签下的<id>一致。这样你就可以用下面配置的新仓库地址去更换原有项目中pom文件里配置的仓库地址了。

        

<settings>
  ...
  <mirrors>
    <mirror>
      <id>CHN</id>
      <name>CHN Central</name>
      <url>http://your/repository/addr/maven2</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
  ...
</settings>



目前maven2的远程仓库的官方地址是: 位于米国的http: //repo.maven.apache.org/maven2, 和腐国的

http://uk.maven.org/maven2. 不过没啥事就不要去改这个默认配置了,反正我用着挺溜的。

好了,最后希望这篇文章对大家能有帮助!