当前位置 : 首页 » 文章分类 :  开发  »  Apache-Maven-基础

Apache-Maven-基础

[TOC]


依赖包没更新导致java.lang.NoSuchMethodError

开发中多次遇到这个问题,场景如下:
common包中更新了方法签名,比如原来是 setValue(long v) 改为 setValue(Long v)
install安装common包到本地.m2库中,引用common包的地方也用使用了修改后的代码,但允许时出现 java.lang.NoSuchMethodError 错误提示没有这个方法。

原因:target中的common包没更新

解决方法:
1、mvn clean 删除target目录
2、再 mvn install 重新引入一下,或 Idea 中在pom文件上右键 Maven -> Reimport

或者直接强制更新依赖。

maven强制更新依赖

mvn clean install -e -U
-e 详细异常,-U 强制更新


概述

Apache Maven是一个软件项目管理的综合工具。基于项目对象模型(POM)的概念,提供管理项目的构建、文档、报告、依赖、发布等方法,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。
maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
Maven的基本原理很简单,采用远程仓库和本地仓库以及一个核心的配置文件pom.xml,pom.xml中定义的jar文件从远程仓库下载到本地仓库,各个项目使用同一个本地仓库的jar,同一个版本的jar只需下载一次,而且避免每个应用都去拷贝jar。同时它采用了现在流行的插件体系架构,所以maven的核心非常的小,只有几兆大小的文件,在执行maven任务时,才会自动下载需要的插件。


Maven核心概念

构建生命周期、阶段和目标

Maven的构建过程被分解为 构建生命周期(life cycles)、阶段(phases)和目标(goals)。一个构建周期由一系列的构建阶段组成,每一个构建阶段由一系列的目标组成。当你运行Maven的时候,你会传入一条命令。这条命令就是构建生命周期、阶段或目标的名字。如果执行一个生命周期,该生命周期内的所有构建阶段都会被执行。如果执行一个构建阶段,在预定义的构建阶段中,所有处于当前构建阶段之前的阶段也都会被执行。

依赖和仓库

Maven执行时,其中一个首要目标就是检查项目的 依赖(dependencies)。依赖是你的项目用到的jar文件(java库)。如果在本地仓库中不存在该依赖,则Maven会从中央仓库下载并放到本地仓库。本地仓库只是你电脑硬盘上的一个目录。你可以根据需要制定本地仓库的位置。你也可以指定下载依赖的远程仓库的地址。

插件plugins

构建 插件(plugins)可以向构建阶段中增加额外的构建目标。如果Maven标准的构建阶段和目标无法满足项目构建的需求,你可以在POM文件里增加插件。Maven有一些标准的插件供选用,如果需要你可以自己实现插件。

配置文件profiles

配置文件(profiles)用于以不同的方式构建项目。比如,你可能需要在本地环境构建,用于开发和测试,你也可能需要构建后用于开发环境。这两个构建过程是不同的。在POM文件中增加不同的构建配置,可以启用不同的构建过程。当运行Maven时,可以指定要使用的配置。


安装配置

下载及安装

http://maven.apache.org/
下载windows版 apache-maven-3.3.9-bin.zip
解压后将文件夹apache-maven-3.3.9拷贝到C:\Program Files即安装完成

配置环境变量

安装配置JDK:安装JDK1.8,新建系统环境变量JAVA_HOME,变量值为C:\Program Files\Java\jdk1.8.0_111
新建系统环境变量MAVEN_HOME,变量值为C:\Program Files\apache-maven-3.3.9
在系统变量Path中增加%MAVEN_HOME%\bin
配置完成后,可打开命令行,输入mvn -v,有版本信息说明配置成功

安装m2eclipse插件

Eclipse中已默认安装了Maven插件。
若未安装,点击eclipse菜单栏Help->Eclipse Marketplace搜索maven,搜索到插件Maven Integration for Eclipse 并点击安装即可。
其实不在Windows中安装maven,只用Eclipse中自带的maven插件也可以满足基本的需要,只是没有settings.xml配置文件。

配置m2eclipse插件

Eclipse-indigo和Eclipse-luna默认都已安装了Maven插件。
Eclipse中Maven配置
Window->Preferences->Maven->User Settings
Global Settings和User Settings中的配置文件都设置为:C:\Users\MaSi.m2\settings.xml
Local Repository项会自动从配置文件中读取,为:C:\Users\MaSi.m2\repository


Maven Wrapper

背景
Maven是一款非常流行的Java项目构建软件,它集项目的依赖管理、测试用例运行、打包、构件管理于一身,是我们工作的好帮手,maven飞速发展,它的发行版本也越来越多,如果我们的项目是基于Maven构件的,那么如何保证拿到我们项目源码的同事的Maven版本和我们开发时的版本一致呢,可能你认为很简单,一个公司嘛,规定所有的同事都用一个Maven版本不就万事大吉了吗?一个组织内部这是可行的,要是你开源了一个项目呢?如何保证你使用的Maven的版本和下载你源码的人的Maven的版本一致呢,这时候mvnw就大显身手了。

mvnw全名是Maven Wrapper,它的原理是在maven-wrapper.properties文件中记录你要使用的Maven版本,当用户执行mvnw clean 命令时,发现当前用户的Maven版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行mvn命令,比如刚才的mvn clean。

为项目添加mvnw支持很简单,有两种方式:

方法一:在Pom.Xml中添加Plugin声明:

<plugin>
    <groupId>com.rimerosolutions.maven.plugins</groupId>
    <artifactId>wrapper-maven-plugin</artifactId>
    <version>0.0.4</version>
</plugin>

这样当我们执行mvn wrapper:wrapper 时,会帮我们生成mvnw.bat, mvnw, maven/maven-wrapper.jar, maven/maven-wrapper.properties这些文件。

然后我们就可以使用mvnw代替mvn命令执行所有的maven命令,比如mvnw clean package

方法二:直接执行Goal(推荐使用这种)
mvn -N io.takari:maven:wrapper -Dmaven=3.3.3 表示我们期望使用的Maven的版本为3.3.3

产生的内容和第一种方式是一样的,只是目录结构不一样,maven-wrapper.jar和maven-wrapper.properties在”.mvn/wrapper”目录下

使用的注意事项

1、由于我们使用了新的Maven ,如果你的settings.xml没有放在当前用户下的.m2目录下,那么执行mvnw时不会去读取你原来的settings.xml文件

2、在mvnw.bat中有如下的一段脚本:if exist "%M2_HOME%\bin\mvn.cmd" goto init,意思是如果找到mvn.cmd就执行初始化操作,但是Maven早期版本不叫mvn.cmd,而是叫mvn.bat,所以会报”Error: M2_HOME is set to an invalid directory”错误,改成你本地的maven的匹配后缀就好了。

mvnw脚本

mvnw是什么?
Maven Wrapper/Maven保持构建工具版本一直的工具
mvnw是一个maven wrapper script,它可以让你在没有安装maven或者maven版本不兼容的条件下运行maven的命令.

原理:

  1. 它会寻找maven在你电脑环境变量path中的路径
  2. 如果没有找到这个路径它就会自动下载maven到一个默认的路径下,之后你就可以运行maven命令了
  3. 有时你会碰到一些项目的peoject和你本地的maven不兼容,它会帮你下载合适的maven版本,然后运行

mvnw是什么(Maven Wrapper/Maven保持构建工具版本一直的工具)
https://www.cnblogs.com/EasonJim/p/7620085.html

http://mvnrepository.com/artifact/com.rimerosolutions.maven.plugins/wrapper-maven-plugin


参考


Maven命令

mvn [options] [<goal(s)>] [<phase(s)>]
-s,--settings <arg>,指定用户settings.xml文件
-D,--define <arg>,定义系统属性,例如-Dmaven.test.skip=true
mvn -v,--version,查看maven版本
mvn -X,--debug,打开debug输出

mvn compile,在项目根目录下执行mvn compile命令可编译项目,build success之后在项目根目录下生成target目录,该目录下存放项目编译后的文件,如.class文件

mvn test,会执行src/test/java 下的Junit测试代码,当然在执行测试之前会自动执行编译命令

mvn package,会将项目打成jar包,并放在target目录中。执行此命令之前会先执行编译和测试命令

mvn install,会将项目jar包安装到本地仓库中,以便其他项目使用。执行此命令之前会先执行编译,测试,打包命令

mvn clean,清理项目,会删除target文件夹,该命令可以结合其他命令运行

mvn deploy,部署构件到maven远程仓库,需要配置<distributionManagement>/<repository>和对应的认证信息。


上一篇 Java-线程

下一篇 Spring-加载Property配置文件

阅读
2,447
阅读预计9分钟
创建日期 2016-09-15
修改日期 2018-09-01
类别
百度推荐