maven

maven

什么是Maven?

如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。

以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。

而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。

安装Maven 和 Maven的Eclipse插件
安装Maven和Maven的Eclipse插件,用Eclipse的同学可以参考,推荐使用IDEA开发;

Maven规定的目录结构
若要使用Maven,那么项目的目录结构必须符合Maven的规范,其目录结构如maven_第1张图片
下:

Maven基本命令
-v:查询Maven版本

本命令用于检查maven是否安装成功。

Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。

compile:编译

将java源文件编译成class文件

test:测试项目

执行test目录下的测试用例

package:打包

将项目打成jar包

clean:删除target文件夹

install:安装

将当前项目放到Maven的本地仓库中。供其他项目使用

什么是Maven仓库?
Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。

本地仓库:Maven本地的Jar包仓库。
中央仓库: Maven官方提供的远程仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。

什么是“坐标”?
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。

如下代码中,groupId和artifactId构成了一个Jar包的坐标。

<dependency>
   <groupId>cn.missbe.web.searchgroupId>
   <artifactId>resource-searchartifactId>
   <packaging>jarpackaging>
   <version>1.0-SNAPSHOTversion>
dependency>
  • groupId:所需Jar包的项目名
  • artifactId:所需Jar包的模块名
  • version:所需Jar包的版本号

传递依赖 与 排除依赖

  • 传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和间接引用的Jar包都下载到本地。
  • 排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<exclusions>
   <exclusion>
      <groupId>cn.missbe.web.searchgroupId>
      <artifactId>resource-searchartifactId>
      <packaging>pompackaging>
      <version>1.0-SNAPSHOTversion>
   exclusion>
exclusions>

依赖范围scope
在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。

  • compile :默认范围,用于编译
  • provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
  • runtime: 在执行时需要使用
  • test: 用于test任务时使用
  • system: 需要外在提供相应的元素。通过systemPath来取得
  • systemPath: 仅用于范围为system。提供相应的路径
  • optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用

依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。

1.短路优先

本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar

若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。

在此时,Maven只会引用引用路径最短的Jar。

2.声明优先

若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。

聚合
什么是聚合?

将多个项目同时运行就称为聚合。

如何实现聚合?

只需在pom中作如下配置即可实现聚合:

<modules>
    <module>web-connection-poolmodule>
    <module>web-java-crawlermodule>
modules>

继承

  1. 什么是继承?

    在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。

  2. 如何实现继承?

  • 父pom配置:将需要继承的Jar包的坐标放入标签即可。

    
          
            cn.missbe.web.search
            resource-search
            pom
            1.0-SNAPSHOT
           
    

  • 子pom配置:
<parent>
      <groupId>父pom所在项目的groupIdgroupId>
      <artifactId>父pom所在项目的artifactIdartifactId>
      <version>父pom所在项目的版本号version>
parent>
 <parent>
      <artifactId>resource-searchartifactId>
      <groupId>cn.missbe.web.searchgroupId>
      <version>1.0-SNAPSHOTversion>
parent>

使用Maven构建Web项目

  1. New Maven项目:选择WebApp:

  2. 若使用JSP,需添加Servlet依赖:

    注:Servlet依赖只在编译和测试时使用!

<dependency>
    <groupId>javax.servletgroupId>
    <artifactId>javax.servlet-apiartifactId>
    <version>3.0.1version>
    
    <scope>providedscope>
dependency>
  1. 在Bulid Path中设置resource输出目录:
  2. 勾选:Dynamic Web Module
  3. 删掉测试目录
  4. 在pom中加入jetty的插件,并设置JDK版本:
<plugins> 
  <plugin> 
    <groupId>org.apache.maven.pluginsgroupId>  
    <artifactId>maven-compiler-pluginartifactId>  
    <configuration> 
      <source>1.8source>  
      <target>1.8target> 
    configuration> 
  plugin>  
  <plugin> 
    <groupId>org.eclipse.jettygroupId>  
    <artifactId>jetty-maven-pluginartifactId>  
    <version>9.3.10.v20160621version>  
    <executions> 
      <execution> 
        <phase>packagephase> 
      execution> 
    executions> 
  plugin> 
plugins>
  1. 运行项目:

  2. 输入:jetty:run

  3. 访问127.0.0.1:8080

    若出现如下界面,表示成功!

pom.xml详解

pom.xml是Maven的核心,你的项目需要什么Jar包就在pom.xml里面配置。当编译项目时Maven读取该文件,并从仓库中下载相应的Jar包。


 
<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.0http://maven.apache.org/maven-v4_0_0.xsd">  
    
  <parent> 
      
    <artifactId/>  
      
    <groupId/>  
      
    <version/> 
  parent>  
    
  <modelVersion>4.0.0modelVersion>  
    
  <groupId>cn.missbe.webgroupId>  
    
  <artifactId>search-resourcesartifactId>  
    
  <packaging>warpackaging>  
    
  <version>1.0-SNAPSHOTversion>  
    
  <name>search-resourcesname>  
    
  <url>http://www.missbe.cnurl>  
    
  <description>A maven project to study maven.description>  
    
  <prerequisites> 
      
    <maven/> 
  prerequisites>  
    
  <build> 
      
    <sourceDirectory/>  
      
    <scriptSourceDirectory/>  
      
    <testSourceDirectory/>  
      
    <outputDirectory/>  
      
    <testOutputDirectory/>  
      
    <extensions> 
        
      <extension> 
          
        <groupId/>  
          
        <artifactId/>  
          
        <version/> 
      extension> 
    extensions>  
      
    <resources> 
        
      <resource> 
          
        <targetPath/>  
          
        <filtering/>  
          
        <directory/>  
          
        <includes/>  
          
        <excludes/> 
      resource> 
    resources>  
      
    <testResources> 
        
      <testResource> 
        <targetPath/>
        <filtering/>
        <directory/>
        <includes/>
        <excludes/> 
      testResource> 
    testResources>  
      
    <directory/>  
      
    <finalName/>  
      
    <filters/>  
      
    <pluginManagement> 
        
      <plugins> 
          
        <plugin> 
            
          <groupId/>  
            
          <artifactId/>  
            
          <version/>  
            
          <extensions/>  
            
          <executions> 
              
            <execution> 
                
              <id/>  
                
              <phase/>  
                
              <goals/>  
                
              <inherited/>  
                
              <configuration/> 
            execution> 
          executions>  
            
          <dependencies> 
              
            <dependency>......dependency> 
          dependencies>  
            
          <inherited/>  
            
          <configuration/> 
        plugin> 
      plugins> 
    pluginManagement>  
      
    <plugins> 
        
      <plugin> 
        <groupId/>
        <artifactId/>
        <version/>
        <extensions/>  
        <executions> 
          <execution> 
            <id/>
            <phase/>
            <goals/>
            <inherited/>
            <configuration/> 
          execution> 
        executions>  
        <dependencies> 
            
          <dependency>......dependency> 
        dependencies>  
        <goals/>
        <inherited/>
        <configuration/> 
      plugin> 
    plugins> 
  build>  
    
  <modules/>  
    
  <repositories> 
      
    <repository> 
        
      <releases> 
          
        <enabled/>  
          
        <updatePolicy/>  
          
        <checksumPolicy/> 
      releases>  
        
      <snapshots> 
        <enabled/>
        <updatePolicy/>
        <checksumPolicy/> 
      snapshots>  
        
      <id>banseon-repository-proxyid>  
        
      <name>banseon-repository-proxyname>  
        
      <url>http://192.168.1.169:9999/repository/url>  
        
      <layout>defaultlayout> 
    repository> 
  repositories>  
    
  <pluginRepositories> 
      
    <pluginRepository>......pluginRepository> 
  pluginRepositories>  
    
  <dependencies> 
    <dependency> 
        
      <groupId>org.apache.mavengroupId>  
        
      <artifactId>maven-artifactartifactId>  
        
      <version>3.8.1version>  
        
      <type>jartype>  
        
      <classifier/>  
        
      <scope>testscope>  
        
      <systemPath/>  
        
      <exclusions> 
        <exclusion> 
          <artifactId>spring-coreartifactId>  
          <groupId>org.springframeworkgroupId> 
        exclusion> 
      exclusions>  
        
      <optional>trueoptional> 
    dependency> 
  dependencies>  
    
  <dependencyManagement> 
    <dependencies> 
        
      <dependency>......dependency> 
    dependencies> 
  dependencyManagement>  
    
  <distributionManagement> 
      
    <repository> 
        
      <uniqueVersion/>  
      <id>banseon-maven2id>  
      <name>banseon maven2name>  
      <url>file://${basedir}/target/deployurl>  
      <layout/> 
    repository>  
      
    <snapshotRepository> 
      <uniqueVersion/>  
      <id>banseon-maven2id>  
      <name>Banseon-maven2 Snapshot Repositoryname>  
      <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshoturl>  
      <layout/> 
    snapshotRepository>  
      
    <site> 
        
      <id>banseon-siteid>  
        
      <name>business api websitename>  
        
      <url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-weburl> 
    site>  
      
    <downloadUrl/>  
      
    <status/> 
  distributionManagement>  
    
  <properties/> 
project>

seon:/var/www/localhost/banseon-web





```

你可能感兴趣的:(maven,java)