Maven使用和配置

一、maven安装和概念

  1. maven安装
  2. maven编译(compile)
  3. 执行测试用例(test)
  4. maven打包(package)
  5. maven依赖管理

1、maven安装

  1. 官网下载Maven http://maven.apache.org/download.cgi
  2. 解压到存放目录
  3. 配置环境变量
  4. 检查是否安装成功(mvn -version)

2、maven编译

  • 创建maven项目
  • 创建src文件
  • 编写pom文件
  • 执行编译命令

编写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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
 
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-project</artifactId>
<version>1.0.SNAPSHOT</version>
</project>
#mvn 编译命令
mvn compile ---------------------------
[INFO] No sources to compile
[INFO] ---------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------------
[INFO] Total time: 0.473 s
[INFO] Finished at: 2018-08-05T15:55:44+08:00
[INFO] Final Memory: 6M/153M
[INFO] ---------------------------------------------------------------

maven 采用了约定的方式从指项目结构中获取源码与资源文件进行编译打包:

  1. 主源码文件:${project}/src/main/java
  2. 主资源文件:${project}/src/main/resources
  3. 测试源码文件:${project}/src/test/java
  4. 测试资源文件:${project}/src/test/resources

将java 文件移至 src/main/java 目录,重新执行编译:

mv src/hello.java /src/main/java/hello.java
mvn compile;

3、maven测试用例

  • 编写测试类
  • 执行测试命令

编写测试类:

# 创建测试目录
mkdir -p /src/test/java
# 编写 测试类
vim TestHello.java
#测试类代码------------------------
package com.test.lin;
public class TestHello{
        public void testSayHello(){
                System.out.println("run test .....");
        }
} #执行测试指令:
mvn test

maven 对测试类又做了约定,约定必须是Test开头的类名与test 开头的方法才会执行。

通常测试我们是通过junit 来编译测试用例,这时就就需添加junit 的依赖。

4、maven打包

#mvn 打包命令
mvn package

5、maven依赖管理

  • 在pom文件中添加junit依赖
  • 修改测试类,加入junit代码
  • 执行测试命令

加入依懒配置:

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

修改测试类引入junit 类:

package com.test.lin;
//引入junit 类
import org.junit.Assert;
import org.junit.Test; public class TestHello{
@Test
        public void testSayHello(){
                Assert.assertEquals("","hi");
        }
}

注意:当我们在classPath 当中加入 junit ,原来test 开头的方法不会被执行,必须加入 @Test注解才能被执行。

在刚才的演示过程当中 ,junit jar包在哪里?是怎么加入到classPath 当中去的?maven 是在执行test 命令的时间 动态从本地仓库中去引入junit jar 包,如果找不到就会去远程仓库下载,然后在引入。

默认远程仓库:

默认远程仓库 maven central 其配置在

maven-model-builder-3.2.1.jar\org\apache\maven\model\pom-4.0.0.xml 位置

本地仓库位置:

本地仓库位置默认在 ~/.m2/respository 下

要修改 ${M2_HOME}/conf/settings.xml 来指定仓库目录

<!-- 指定本地仓库目录-->

<localRepository>G:.m2\repository</localRepository>

6、maven 核心功能总结:

  1. maven 核心作用是编译、测试、打包。

  2. 根目录下的pom.xml 文件设置分组ID与artifactId。

  3. maven 基于约定的方式从项目中获取源码与资源文件进行编译打包。

  4. 对于项目所依懒的组件与会本地仓库引用,如果本地仓库不存在则会从中央仓库下载。

二、maven核心配置

  1. 项目依懒(内部、外部)

  2. 项目聚合与继承

  3. 项目构建配置

1、项目依赖

项目依赖是指maven 通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目ClassPath。

  1. 依赖传播特性

    我们的项目通常需要依赖第三方组件,而第三方组件又会依赖其它组件遇到这种情况Maven会将依赖网络中的所有节点都会加入ClassPath当中,这就是Maven的依赖传播特性。

    • 举例Spring MVC的依赖网络

      <!-- 添加spring web mvc演示 -->
      <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.0.4.RELEASE</version>
      </dependency>

      在刚刚的演示当中,项目直接依赖了spring-webmvc 叫直接依赖,而对commons-logging 依赖是通过webmvc传递的所以叫间接依赖。

  2. 依赖优先原则

    基于依赖传播特性,导致整个依赖网络会很复杂,难免会出现相同组件不同版本的情况。Maven此时会基于依赖优先原则选择其中一个版本。

    第一原则:最短路径优先。

    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    </dependency>

    上述例子中commons-logging 通过spring-webmvc 依赖了1.1.3,而项目中直接依赖了1.2,基于最短路径原则项目最终引入的是1.2 版本。

    第二原则:相同路径下配置在前的优先。

  3. 可选依赖

    可选依赖表示这个依赖不是必须的。通过在 <dependency> 添 <optional>true</optional> 表示,默认是不可选的。可选依赖不会被传递。

  4. 排除依赖

    即排除指定的间接依赖。通过配置 <exclusions> 配置排除指定组件。

    <!-- 排除指定项目 -->
    <exclusions>
        <exclusion>
           <groupId>org.springframework</groupId>
           <artifactId>spring-web</artifactId>
        </exclusion>
    </exclusions>
  5. 依赖范围

    像junit 这个组件 我们只有在运行测试用例的时候去要用到,这就没有必要在打包的时候把junit.jar 包过构建进去,可以通过Mave 的依赖范围配置<scope>来达到这种目的。maven 总共支持以下四种依赖范围:

    compile(默认): 编译范围,编译和打包都会依赖。

    provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar

    runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar

    test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar

    system:表示由系统中CLASSPATH指定。编译时依赖,不会打包进去。配合<systemPath> 一起使用。示例:java.home下的tool.jar

    system 除了可以用于引入系统classpath 中包,也可以用于引入系统非maven 收录的第三方Jar,做法是将第三方Jar放置在 项目的 lib 目录下,然后配置 相对路径,但因system 不会打包进去所以需要配合 maven-dependency-plugin 插件配合使用。当然推荐通过将第三方Jar手动install 到仓库。

2、项目聚合与继承

  1. 聚合

    是指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用 <modules> 进行配置其中对应的是子工程的相对路径。

    <modules>
        <module>lin-client</module>
        <module>lin-server</module>
    </modules>
  2. 继承

    继承是指子工程直接继承父工程 当中的属性、依赖、插件等配置,避免重复配置。

    1. 属性继承:

    2. 依赖继承:

    3. 插件继承:

    上面的三个配置子工程都可以进行重写,重写之后以子工程的为准。

  3. 依赖管理

    通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一至,这时就可以在父工程中加入 <dependencyManagement> 声明该功程需要的JAR包,然后在子工程中引入。

    <!-- 父工程中声明 junit 4.12 -->
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    </dependency>
    </dependencies>
    </dependencyManagement>
    <!-- 子工程中引入 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    </dependency>
  4. 项目属性

    通过 <properties> 配置 属性参数,可以简化配置。

    !-- 配置proName属性 -->
    <properties>
    <proName>ddd</proName>
    </properties>
    <!-- 引用方式 -->
    ${proName}
    maven 默认的属性
    ${basedir} 项目根目录
    ${version}表示项目版本;
    ${project.basedir}同${basedir};
    ${project.version}表示项目版本,与${version}相同;
    ${project.build.directory} 构建目录,缺省为target
    ${project.build.sourceEncoding}表示主源码的编码格式;
    ${project.build.sourceDirectory}表示主源码路径;
    ${project.build.finalName}表示输出文件名称;
    ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes

3、项目构建配置

  1. 构建资源配置

  2. 编译插件

  3. profile 指定编译环境

构建资源配置:

<defaultGoal>package</defaultGoal>
<directory>${basedir}/target2</directory>
<finalName>${artifactId}-${version}</finalName>

说明:

defaultGoal,执行构建时默认的goal或phase,如jar:jar或者package等

directory,构建的结果所在的路径,默认为${basedir}/target目录

finalName,构建的最终结果的名字,该名字可能在其他plugin中被改变

三、maven生命周期

  1. 生命周期的概念和意义

  2. maven 三大生命周期与其对应的phase(阶段)

  3. 生命周期与插件的关系

  4. 生命周期与默认插件的绑定

1、生命周期的概念和意义

在项目构建时通常会包含清理、编译、测试、打包、验证、部署,文档生成等步骤,maven 统一对其进行了整理抽像成三个生命周期 (lifecycle)及各自对应的多个阶段(phase)。这么做的意义是:

  1. 每个阶段都成为了一个扩展点,可以采用不同的方式来实现,提高了扩展性与灵活性。

  2. 规范统一了maven 的执行路径。

在执行项目构建阶段时可以采用jar方式构建也可以采用war包方式构建提高了灵活性。我们可以通过命令 mvn ${phase name}直接触发指定阶段的执行

如:

#执行清理phase
mvn clean
#执行compile phase
mvn compile
# 也可以同时执行 清理加编译
mvn clean comile

2、maven三大生命周期与其对应的plase(阶段)

maven 总共包含三大生生命周期

  1. clean Lifecycle :清理生命周期,用于于清理项目

  2. default Lifecycle:默认生命周期,用于编译、打包、测试、部署等

  3. site Lifecycle 站点文档生成,用于构建站点文档

生命周期(lifecycle) 阶段(phase) 描述(describe)
clean Lifecycle pre-clean 预清理
clean 清理
post-clean 清理之后
default Lifecycle validate 验证
initialize 初始化
generate-sources
process-sources
generate-resources
process-resources
compile 编译
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile 编译测试类
process-test-classes
test 执行测试
prepare-package 构建前准备
package 打包构建
pre-integration-test
integration-test
post-integration-test
verify 验证
install 上传到本地仓库
deploy 上传到远程仓库
site Lifecycle pre-site 准备构建站点
site 构建站点
post-site 构建站点之后
site-deploy 站点部署

三大生命周期其相互独立执行,也可以合在一起执行。但lifecycle 中的phase 是有严格执行的顺序的,比如必须是先执行完compile 才能执行pakcage 动作,此外phase 还有包含逻辑存在,即当你执行一个phase 时 其前面的phase 会自动执行。

# 执行编译
mvn compile
# 执行打包就包含了编译指令的执行
mvn package

3、生命周期与插件的关系

生命周期的phase组成了项目过建的完整过程,但这些过程具体由谁来实现呢?这就是插件,maven 的核心部分代码量其实很少,其大部分实现都是由插件来完成的。比如:test 阶段就是由 maven-surefire-plugin 实现。在pom.xml 中我们可以设置指定插件目标(gogal)与phase 绑定,当项目构建到达指定phase时 就会触发些插件gogal 的执行。 一个插件有时会实现多个phas比如:maven-compiler-plugin插件分别实现了compile 和testCompile。

总结:

生命周期的 阶段 可以绑定具体的插件及目标

不同配置下同一个阶段可以对应多个插件和目标

phase==>plugin==>goal(功能)

4、生命周期与插件的默认绑定

在我们的项目当中并没有配置 maven-compiler-plugin 插件,但当我们执行compile 阶段时一样能够执行编译操作,原因是maven 默认为指定阶段绑定了插件实现。列如下以下两个操作在一定程度上是等价的。

#
mvn compile
#直接执行compile插件目标
mvn org.apache.maven.plugins:maven-compiler-plugin:3.1:compile

四、maven自定义插件开发

  1. 插件的相关概念

  2. 常用插件的使用

  3. 开发一个自定义插件

1、插件的相关概念

插件坐标定位:

插件与普通jar 包一样包含 一组件坐标定位属性即:

groupId、artifactId、version,当使用该插件时会从本地仓库中搜索,如果没有即从远程仓库下载

<!-- 唯一定位到dependency 插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>

插件执行execution:

execution 配置包含一组指示插件如何执行的属性:

id : 执行器命名

phase:在什么阶段执行?

goals:执行一组什么目标或功能?

configuration:执行目标所需的配置文件?

# 将插件依赖拷贝到指定目录
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration> <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<excludeTransitive>true</excludeTransitive>
</configuration>
</execution>
</executions>
</plugin>

2、常用插件使用

除了通过配置的方式使用插件以外,Maven也提供了通过命令直接调用插件目标其命令格式如下:

mvn groupId:artifactId:version:goal -D{参数名}
# 展示pom的依赖关系树
mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:tree
# 也可以直接简化版的命令,但前提必须是maven 官方插件
mvn dependency:tree 其它常用插件:
# 查看pom 文件的最终配置
mvn help:effective-pom
# 原型项目生成
archetype:generate
#快速创建一个WEB程序
mvn archetype:generate -DgroupId=tuling -DartifactId=simple-webbapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
#快速创建一个java 项目
mvn archetype:generate -DgroupId=tuling -DartifactId=simple-java -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

3、开发一个自定义插件

  • 创建maven 插件项目

  • 设定packaging 为maven-plugin

  • 添加插件依赖

  • 编写插件实现逻辑

  • 打包构建插件

插件 pom 配置:

<?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>
<groupId>tuling</groupId>
<version>1.0.SNAPSHOT</version>
<artifactId>tuling-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
</project>

插件实现类:

package com.tuling.maven; 

import javafx.beans.DefaultProperty;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter; @Mojo(name = "lin")
public class LubanPlugin extends AbstractMojo {
@Parameter
String sex; @Parameter
String describe; public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info(String.format("lin sex=%s describe=%s",sex,describe));
}
}

五、nexus私服搭建

  1. 私服的使用场景

  2. nexus 下载安装

  3. nexus 仓库介绍

  4. 本地远程仓库配置

  5. 发布项目至nexus 远程仓库

  6. 关于SNAPSHOT(快照)与RELEASE(释放) 版本说明

1、私服的使用场景

私服使用场景如下:

  1. 公司不能连接公网,可以用一个私服务来统一连接
  2. 公司内部jar 组件的共享

2、nexus下载安装

nexus下载地址:https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.14.5-02-bundle.tar.gz

解压并设置环境变量:

#解压
shell>tar -zxvf nexus-2.14.5-02-bundle.tar.gz
#在环境变量当中设置启动用户
shell> vim /etc/profile
#添加profile文件。安全起见不建议使用root用户,如果使用其它用户需要加相应权限
export RUN_AS_USER=root

配置启动参数:

shell> vi ${nexusBase}/conf/nexus.properties
 #端口号
 application-port=9999
启动与停止nexus
#启动
shell>  ${nexusBase}/bin/nexus start
#停止
shell>  ${nexusBase}/bin/nexus stop

登录nexus界面:

地址:http://{ip}:9999/nexus/

用户名:admin

密码:admin123

3、nexus仓库介绍

3rd party:第三方仓库

Apache Snapshots:apache 快照仓库

Central: maven 中央仓库

Releases:私有发布版本仓库

Snapshots:私有 快照版本仓库

4、本地远程仓库配置

在pom 中配置远程仓库:

<repositories>
<repository>
<id>nexus-public</id>
<name>my nexus repository</name>
<url>http://192.168.0.147:9999/nexus/content/groups/public/</url>
</repository>
</repositories>

或者在settings.xml 文件中配置远程仓库镜像 效果一样,但作用范围广:

<mirror>
<id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
  <url>http://192.168.0.147:9999/nexus/content/groups/public/</url>
</mirror> 

5、发布项目至nexus远程仓库

配置仓库地址:

<distributionManagement>
<repository>
<id>nexus-release</id>
<name>nexus release</name>
<url>http://192.168.0.147:9999/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshot</id>
<name>nexus snapshot</name>
<url>http://192.168.0.147:9999/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>

设置 setting.xml 中设置server:

<server>
      <id>nexus-snapshot</id>
      <username>deployment</username>
      <password>deployment123</password>
    </server>
<server>
      <id>nexus-release</id>
      <username>deployment</username>
      <password>deployment123</password>
    </server>

执行deploy 命令:

mvn deploy

Maven使用和配置的更多相关文章

  1. [Java] Maven 安装和配置

    1. 下载 Maven 在百度输入 Maven 搜索 ,找到它的官网(http://maven.apache.org/),点击进入下载页面. 下载页面地址: http://maven.apache.o ...

  2. maven安装和配置

    一.下载maven maven下载页 里面有一些版本区别,binary比较小,适合直接在项目中使用,source带了源代码,windows系统下载zip后缀的 apache-maven-3.3.9-b ...

  3. maven - 安装与配置

    最近在了解maven的相关东西,在网上查了一些资料,现在简单整理一下. 一.maven 安装 1.先检查JDK ,Maven是一个java工具,所以请确保jdk环境已经正确安装在你的机器上. 2.点击 ...

  4. 【maven】之配置开发,测试,正式环境pom.xml文件

    在进行web程序开发,如果项目组没有使用自动化发布工具(jenkins + maven + svn + tomcat ),我们一般会使用maven的热部署来完成发布,在部署的过程中我们开发,测试,生产 ...

  5. Maven安装与配置

    下载: 1.从官网http://maven.apache.org中下载,下载下来的是一个压缩包,解压即可.因为Maven本身也是用Java实现的.2.Maven的目录结构   /bin; maven的 ...

  6. maven 环境的配置 JAVA_HOME not found in your envirnment

    maven 的环境配置在配置maven前 先做好java的环境配置现在假定java已经配置好了.在环境变量中添加;maven的解压路径\bin 例如:D:\soft\java\apache-maven ...

  7. MyEclipse下Maven的安装配置

    Maven常用命令: •mvn archetype:generate :创建 Maven 项目 •mvn compile :编译源代码 •mvn test-compile :编译测试代码 •mvn t ...

  8. 学习笔记-[Maven实战]-第二章:Maven安装和配置

    在windows上安装Maven 1.检查JDK安装:在CMD下运行以下命令来检查JAVA安装情况: 命令: C:\Documents and Settings\Administrator>ec ...

  9. Maven 的安装配置

    Maven 的安装配置 一.在安装 Maven 之前,先确保JDK1.7及以上版本并且配置好环境变量. 二.下载maven的bin,在apache官方网站可以下载. 1.首先去官网下载 Maven:h ...

  10. Maven配置jar(war)包自动打包上传Maven服务器的配置

    Maven配置jar(war)包自动打包上传Maven服务器的配置 创建jar(war)包工程 创建一个maven工程 在工程中穿件一个测试类 配置pom.xml <distributionMa ...

随机推荐

  1. C# 查找其他应用程序并打开、显示、隐藏、关闭的API

    软件开发中,有时迫不得已要用到第三方的软件,这时就涉及到在C#应用程序需要对第三方软件打开.显示.隐藏以及关闭. 下面列举了几个常用的方式 打开应用程序,下面是2种简单用法: 第一种: public ...

  2. vim的背景配置

    1.vim背景颜色的配置 在usr/share/vim/vim74/colors   目录下有可以配置的颜色方案,可以查看: 命令:vim/etc/vimrc 打开vim的配置文件,   在最后加入一 ...

  3. mediawiki问题

    部分内容参考 http://blog.csdn.net/gaogao0603/article/details/7689670 1.启用文件上传:在LocalSettings.php修改或者增加如下:$ ...

  4. shell_xtrabackup_backup_mysql

    #!/bin/bash# Name: xtra_back_mysql.sh# Desc:该脚本使用xtrabackup工具对mysql数据库进行增量备份,根据自己需求可以自行修改# Usage:./x ...

  5. poj-3657 Haybale Guessing(二分答案+并查集)

    http://poj.org/problem?id=3657 下方有中文版,不想看英文的可直接点这里看中文版题目 Description The cows, who always have an in ...

  6. PAT甲级——1006 Sign In and Sign Out

    PATA1006 Sign In and Sign Out At the beginning of every day, the first person who signs in the compu ...

  7. Revit二次开发-获取材质的纹理贴图

    通过IExportContext导出类中的Onmaterial()方法,可以获取到材质相关信息,主要是材质ID,再根据材质ID得到材质对象material,然后通过如下代码获取Asset对象: Ele ...

  8. rest framework-版本-长期维护

    ###############  版本   ############### # # 版本的问题: # rest_framework.versioning.URLPathVersioning # 一般就 ...

  9. 关于Java中注解的总结

    注解用来给类声明附加额外信息,可以标注在类.字段.方法等上面,编译器.JVM以及开发人员等都可以通过反射拿到注解信息,进而做一些相关处理 Java中注解的知识结构图 常用注解 @Override   ...

  10. FireWall2

    配置防火墙步骤: 1.给接口配置ip,开 service-manage 服务 2.把接口画在zone区域 3.配置策略 4.服务器一定要开启服务 1. interface GigabitEtherne ...