使用maven来管理您的java项目
maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译、构建、测试、发布和报告等。在大型项目开发中,使用maven来管理是必不可少的。
1、Windows安装
1) 从官网(http://maven.apache.org/download.cgi)下载需要安装的maven版本,并解压到本地磁盘中;
2) 在系统环境变量中新建一个变量,名称为M2_HOME,值为maven所在路径,如:D:\apache-maven-3.3.1;
3) 在环境变量Path中添加maven/bin目录,值为:%M2_HOME%\bin,注意变量之间用分号间隔;
验证安装:cmd中输入命令mvn -v,如能正确显示版本则说明安装成功
2、Eclipse安装
1) Eclipse中安装maven,只需要安装插件m2eclipse即可。最好将插件中的maven替换为本地安装的maven,因此通常需要事先安装本地maven。
打开Eclipse,选择Help->Install New Software,输入地址:http://download.eclipse.org/technology/m2e/releases(或:http://download.eclipse.org/technology/m2e/milestones/1.8/),等待安装完成。打开检查windows->Preferences,如果看到maven,则说明安装成功。
配置Eclipse中的maven:
① windows->Preferences->Maven->Installations,新增选择本地安装的Maven目录,然后切换成本地的Maven;
② windows->Preferences->Maven->user Settings,更改User Settings为本地安装Maven目录下conf中的settings.xml;
使用Eclipse新建maven项目时,选择Maven->Maven Project,最常用的ArtifactId为maven-archetype-quickstart和concoon-22-archetype-webapp。
2) 常见Eclipse执行maven命令错误及解决方案
① 提示:-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match
解决:设一个环境变量M2_HOME指向你的maven安装目录(如:M2_HOME=D:\Apps\apache-maven-3.3.1),然后在Window->Preference->Java->Installed JREs->Edit在Default VM arguments中设置-Dmaven.multiModuleProjectDirectory=$M2_HOME
② 提示:Unsupported major.minor version 51.0
解决:由于Maven项目编译JDK与系统安装JDK版本不一致导致,项目右键设置Compiler与安装JDK一致即可
3、说明配置
mvn的全球资源库为:http://mvnrepository.com/,默认的中央仓库路径:https://repo.maven.apache.org/maven2(来自apache-maven-xxx/lib/maven-model-builder-xxx.jar/org/apache/maven/model/pom-4.0.0.xml中Central Repository的url值)。
maven搜索资源时,会现在本地的仓库中进行搜索,不存在对应的jar资源,则到中央仓库中搜索并下载到本地仓库中。
本地仓库默认路径为:{用户文档}/.m2/,通常需要修改到指定位置,只要修改apache-maven-xxx/conf/settings.xml文件中的localRepository值,如:<localRepository>D:\java-learn\mvn-repository</localRepository>
在项目中添加需要的jar,可在官方资源库(http://search.maven.org/)中搜索,然后将需要的jar的GAV配置信息复制到你的pom.xml配置中即可。
mvn compile 编译项目
mvn package 打包发布(生成的jar包名称默认为:{artifactId}-{version}.jar,如:maven-test01-0.0.1-SNAPSHOT.jar)
mvn package -Dmaven.test.skip=ture 打包时跳过测试
mvn clean 清理(删除target目录)
mvn install 在本地Repository中安装jar(项目被依赖时必须先将项目打包到资源repository中)
mvn test 运行应用程序中的单元测试
mvn archetype:generate 快速生成一个maven项目,根据提示输入groupId、artifactId、version可自动创建一个包含基本架构的maven项目
Choose a number or apply filter (format: ...): 直接回车,然后选择版本,接着分别输入groupId、artifactId、version
mvn archetype:generate -DgroupId-{groupId} -DartifactId-{artifactId} -Dversion-{version} 指定GAV快速创建maven项目,如mvn archetype:generate -DgroupId-com.hicoor.maven -DartifactId-maven-test03 -Dversion-0.0.1-SHAPSHOT
1、maven项目文件结构
所有使用maven管理的项目,其文件结构都是固定的,这相当于给项目的文件结构制定了一个通用规范,使得项目更加容易理解。maven项目结构如图1所示。
图1 maven项目文件结构
进入项目根目录(也就是pom.xml文件所在路径),执行编译命令:mvn compile,会在项目根目录中创建一个target文件夹,里面包含已编译的文件;执行编译测试:mvn test,会在target中设生成编译源码和测试报告,实测报告在surefire-reports目录中。
2、pom.xml文件结构与标签含义
pom.xml文件内容结构如:
<?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>com.hicoor.maven</groupId>
<artifactId>maven-test01</artifactId>
<version>0.0.1-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>..</groupId>
<artifactId>..</artifactId>
<version>..</version>
</dependency>
</dependencies> </project>
其中部分标签与含义如下:
1) project,pom.xml文件中的顶层元素;
2) modelVersion,指明POM使用的对象模型的版本,值很少改动;
3) groupId,指明创建项目的组织或者小组的唯一标识。GroupId是项目的关键标识,典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins是所有Maven插件项目指定的groupId;
4) artifactId,模块名称)指明此项目产生的主要产品的基本名称。项目的主要产品通常为一个JAR文件。第二,象源代码包通常使用artifactId作为最后名称的一部分。典型的产品名称使用这个格式: <artifactId><version>;
5) version,版本号,格式通常为x.x.x-里程碑。通常情况下,第一个x表示程序架构上发生重大变化,第二个x表示程序架构中的分支变化,第三个x表示程序改动的次数。常见的里程碑有如下值:① SNAPSHOT,快照版,正在开发的版本;② Alpha,是内部测试版,一般不向外部发布,会有很多Bug,一般只有测试人员使用;③ Beta,公共测试版,通常有客户单位参与的测试;④ Release,即Release Candidate,候选版本,RC版不会再加入新的功能了,主要着重于除错;⑤ GA,即General Availability,正式发布的版本。
依赖特性在<scope></scope>中配置,如:
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope>compile</scope>
<!--排除依赖,当多个间接依赖冲突时使用-->
<exclustions>
<exclustion>
<groupId>xx_groupId</groupId>
<artifactId>xx_artifactId</artifactId>
</exclustion>
</exclustions>
</dependency>
</dependencies>
1、scope依赖关系的值
1) compile(编译范围),缺省值,适用于所有阶段,会随着项目一起发布;
2) provided(已提供范围),类似compile,打包时会将该包排除,期望JDK、容器或使用者会提供这个依赖。如servlet.jar;
3) runtime(运行时范围):依赖在运行和测试系统的时候需要,但在【编译】的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC;
4) test(测试范围),只在测试时使用,用于编译和运行测试代码。不会随项目发布;
5) system(系统范围),类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它;
2、依赖的传递
当一个项目依赖另一个项目时,会将被依赖项目中的所有compile的依赖传递过来 。
1) (当依赖级别相同的时候)间接依赖存在先后性
假设项目A依赖了xx-1.6.jar,项目B依赖了xx-2.3.jar。当项目C同时依赖A和B时,在xx对于项目C是间接依赖,C会加载1.6还是2.3的版本取决于C先依赖A还是先依赖B,即Maven不会自动判断间接依赖的包的版本。
2) (当依赖级别不同的时候)优先依赖级别少的那个依赖
假设项目A依赖了项目D,项目D中有依赖yy-3.3.jar,项目B依赖了yy-4.3.jar。当项目C同时依赖A和B时,由于C->A->D->yy为三级依赖,C->B->yy为二级依赖,所以项目C会间接依赖yy-4.3.jar。
3、依赖的排除
当多个依赖存在冲突的时候,可以使用exclustion,将不需要的间接依赖排除掉。
1、聚合多个模块
一个项目中可能存在多个模块,将他们聚合到一个maven项目中可同时编译多个模块,避免大量重复操作。
聚合方法:在模块的同级目录中新建一个简单Maven项目,只包含一个pom.xml配置文件,使用<modules></modules>聚合需要的模块(位于标签<project></project>内),聚合示例如:
<modules>
<!--根据相对路径使用../-->
<module>../maven-test01</module>
<module>../maven-test02</module>
</modules>
2、pom.xml配置文件的继承
在多个maven项目中可能存在大量的重复的pom.xml配置内容,可以将这些重复的内容放到一个基本maven项目中,然后在其他maven项目中使用标签<parent></parent>继承。
如新建了一个maven-parent基础配置项目,则其他项目继承时在pom.xml中添加如下内容:
<parent>
<!--通过GAV定位parent项目-->
<groupId>com.hicoor.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../maven-parent/pom.xml</relativePath>
</parent>
在maven-parent中不仅可以添加常用的配置,也可以添加dependencyManagement依赖管理,每个子项目需要添加父项目管理的依赖时,可不指定项目版本号,maven在编译时会自动向上去寻找版本号。
例如在maven-parent的pom.xml中指定<project></project>内容:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.2</version>
</dependency>
<!-- 添加其他依赖 -->
</dependencies>
</dependencyManagement>
则在其他继承项目中可以直接引用mysql依赖而不用指定版本号,如:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改。另外如果某个子项目需要另外的一个版本,只需要声明version就可。
注意:使用parent结构后,打包命令要基于parent/pom.xml,会自动给子项目打包。
在公司内多人联合开发maven项目时,为避免版本换乱,最好搭建一个局域网内部maven资源服务器,所有的项目会自动搜索使用该服务器内的资源。 甚至有些公司内部不允许访问互联网,此时搭建maven私有服务器就显得更有必要了。
1、搭建安装Nexus(参考:http://www.cnblogs.com/quanyongan/archive/2013/04/24/3037589.html)
1) 去官网(http://www.sonatype.org/nexus)下载免费OSS版本,并解压到本地磁盘,注意Pro版本是收费的;
2) 添加Path环境变量,如:D:\java-learn\nexus-2.11.1-01-bundle\nexus-2.11.1-01\bin;
3) 安装nexus服务,在cmd中输入nexus install,或在nexus-2.11.1-01-bundle\nexus-2.11.1-01\bin\jsw\windows-x86-64中双击运行install-nexus.bat;
4) 启动服务后,访问web管理界面http://localhost:8081/nexus/,默认登录用户admin,默认密码admin123;
2、web界面说明
左侧菜单点击Repositories,右侧List中有一列为Type,其值与含义如下:
1) hosted,为内部服务,面向局域网;
2) 3rd party,用来保存第三方jar(典型的oracle数据库的j驱动包);
3) Snapshots,用来保存项目组内部的快照;
4) Releases,用来保存项目组内部的发布版;
5) Central,中央工厂下载的所有jar存放与此;
3、Nexus配置
1) 配置只在当前maven项目中使用nexus私服,在pom.xml中添加如下内容:
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
2) 配置使所有的maven项目默认使用nexus服务器,打开maven安装目录apache-maven-x.x.x\conf下的settings.xml,在<profiles></profiles>标签中添加如下内容:
<profile>
<id>nexusProfile</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!-- releases和snapshots依赖默认是关闭的,需要手动打开 -->
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
并在<settings></settings>标签中激活使用哪种profile,配置如下:
<activeProfiles>
<!-- 只有激活之后才会生效 -->
<activeProfile>nexusProfile</activeProfile>
</activeProfiles>
4、发布项目到Nexus
将自己的maven项目发布到nexus中,步骤如下:
1) 在项目pom.xml中添加如下配置:
<distributionManagement>
<repository>
<id>hicoor-release</id>
<name>Releases</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>hicoor-snapshot</id>
<name>Snapshots</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
2) 打开文件apache-maven-x.x.x\conf\settings.xml,在<servers></servers>标签内添加如下内容(注意id要与项目pom.xml中的id对应):
<server>
<id>hicoor-release</id>
<username>deployment</username>
<password>deployment123</password>
</server>
<server>
<id>hicoor-snapshot</id>
<username>deployment</username>
<password>deployment123</password>
</server>
3) 在Eclipse发布项目,pom.xml->Run As->Maven bulid,输入clean deploy,即可将项目发布到nexus中。
参考:https://www.cnblogs.com/noteless/p/5213075.html
错误处理:
1) 创建Maven项目过程报错,错误信息“could not calculate build plan: plugin maven-war-plugin..”,解决办法是:将maven资源路径下org\apache\maven\plugins内清空,再次操作即可。
2) Maven项目创建完后,右键->Properties->Project Facets,选择Dynamic Web Module时,如果提示错误“Dynamic Web Module 3.0 requires Java 1.6 or newer”,解决办法是,在项目的pom.xml的<build></build>标签中加入如下内容,然后保存,项目构建完成后在项目文件夹上点右键,选择Maven->Update Project Configuration,问题解决。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
1、升级maven-jar-plugin后pom.xml报错误:m2e error in MavenArchiver.getManifest()
解决方案,升级eclipse m2e扩展,操作步骤,eclipse -> Help > Install New Software,使用下述其中一个资源进行安装:① http://repo1.maven.org/maven2/.m2e/connectors/m2eclipse-mavenarchiver/0.17.2/N/LATEST/; ② https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST/
参考:http://stackoverflow.com/questions/37555557/m2e-error-in-mavenarchiver-getmanifest
修改maven根目录下的conf文件夹中的setting.xml文件,内容如:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
使用maven来管理您的java项目的更多相关文章
- Scala IDEA for Eclipse里用maven来创建scala和java项目代码环境(图文详解)
这篇博客 是在Scala IDEA for Eclipse里手动创建scala代码编写环境. Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群模式) ...
- 用maven来创建scala和java项目代码环境(图文详解)(Intellij IDEA(Ultimate版本)、Intellij IDEA(Community版本)和Scala IDEA for Eclipse皆适用)(博主推荐)
不多说,直接上干货! 为什么要写这篇博客? 首先,对于spark项目,强烈建议搭建,用Intellij IDEA(Ultimate版本),如果你还有另所爱好尝试Scala IDEA for Eclip ...
- Maven 学习笔记——将普通的Java项目转换成Maven项目(3)
将一个普通的java项目转换成Maven项目并不是一个很大的任务,仅仅只需要下面的几步就能将转换成功.下面我是用一个简单的Selenium测试小demon作为例子来说的. 移调项目中所有关联的Libr ...
- 【1】maven来管理我的SSM项目
新建个maven项目,第一步当然是配置好自己需要的jar包,maven使用pom.xml管理 并不是每一个都有用,但是都是常见jar,方便以后自己调用来查找 <project xmlns=&qu ...
- 使用Maven创建(eclipse)Java项目
1. 构建项目目录: 命令行方式: mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} \ ...
- 通过Maven管理多个MapReduce项目
1. 配置Maven环境 首先检查Windows是否配置了maven,进入cmd命令行,输入mvn -version命令,如果出现下图所示的 情形则表示满意配置maven. 从浏览器进入maven官网 ...
- Maven命令创建java项目
------------------------------java项目搭建--------------------------- 使用Maven构建一个简单的Java项目 1.进入命令行,执行下面的 ...
- maven3常用命令、java项目搭建、web项目搭建详细图解
http://blog.csdn.net/edward0830ly/article/details/8748986 ------------------------------maven3常用命令-- ...
- 转 maven3常用命令、java项目搭建、web项目搭建详细图解
转自地址:http://blog.csdn.net/edward0830ly/article/details/8748986 ------------------------------maven3常 ...
随机推荐
- Leetcode Partition List
Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...
- Codeforces Round #215 (Div. 2) C. Sereja and Algorithm
#include <iostream> #include <vector> #include <algorithm> #include <string> ...
- 2015 CTSC & APIO滚粗记
o诶人太弱..... 记一发滚粗记以便治疗我的健忘症= = //文章会不定时修改,添加一些内容什么的...因此最好看一下刷新一下(因为有可能你正在看= =我正在写... 5.2 早上9点坐上长达11小 ...
- php 安装memcacheq
berkeley: http://download.oracle.com/otn/berkeley-db/db-6.1.19.tar.gz?AuthParam=1408431634_4887d4468 ...
- PHP slim restfull框架nginx 配置
http://docs.slimframework.com/ 下载地址这个东西很不错,照到官方的例子做 <?php require 'vendor/autoload.php'; $app = n ...
- 将bootstrap弹出框的点击弹出改为鼠标移入弹出
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- mvn生成runnablejar 的方法
主要讲3点,生成runnable jar 方法1是生成一个目录 方法2是直接一个runnable的jar 方法3是关于包含spring工程的情况 方法2和3其实是一致的 1.生成runnable j ...
- Hadoop.2.x_WordCount本地测试示例
代码如下, 后备参考: package com.bigdata.hadoop.hdfs; import java.io.IOException; import org.apache.hadoop.co ...
- Linux_文件打包,压缩,解压
一.压缩命令 文件格式:*.gz 命令:gzip 文件名 (ps:不能压缩目录,切压缩后不保留原文件) 压缩前 -rw-r--r--. 1 root root 315 Sep 6 21:03 df.t ...
- MySQL中引号的问题
原文: http://blog.csdn.net/wisgood/article/details/6317543 mysql中一个字符串,既可以用两个单引号表示,也可以用两个双引号表示. 比如字符串 ...