Maven项目管理工具(maven管理项目有什么好处)
maven简介
Maven全称是Apache Maven Project–Apache的优秀开源项目,Maven是java项目的构建和管理工具。Maven这个词翻译为“专家”或者“内行”,是跨平台的项目管理工具。Maven主要服务于Java平台的项目构建,依赖管理,项目信息管理等。
接下来是项目构建的过程,通常项目构建的过程分为这六个步骤:
理想的项目构建是高度自动化、跨平台,可重用、的组件,使用Maven就可以帮助我们完成上述项目构建的完整过程。
再有就是依赖管理。所谓的依赖管理其实就是使用Maven来管理项目中所使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。
注意Maven的使用依赖于Java,因此需要提前安装Java。
Maven的安装
Maven的用途很大,这里简单说一下:
1、用Maven可以方便的创建项目,基于archetype可以创建多种类型的java项目;
2、Maven仓库对jar包(artifact)进行统一管理,避免jar文件的重复拷贝和版本冲突;
3、团队开发,Maven管理项目的release(正式版本)和snapshot(开发版本)版本,方便多模块(module)项目的各个模块之间的快速集成
点击这里使用镜像下载Maven:maven下载
选择所需要的的版本后,接着选择binaries这个文件夹,再选择以.zip结尾的文件就可以了,然后进行下载,解压。接下来介绍Maven解压后的目录结构,如下图所示:
bin:含有mvn运行的脚本;
boot:含有plexus-classwords类加载器框架;
conf:含有setting.xml配置文件;
lib:含有Maven运行时所需要的java类库;
后面的3个txt文件主要针对Maven版本,第三方软件进行简单介绍。
接下来进行Maven环境变量的配置:我的电脑–>属性–>高级系统设置–>环境变量–>系统变量–>新建:变量名:M2_HOME;变量值:G:ApplicationMavenapache-maven-3.6.0(也就是Maven解压后的目录),接着找到Path在环境变量值尾部加入;%M2_HOME%bin; 注意前面的分号 !
最后检查Maven是否安装成功: 打开dos窗口运行命令mvn -version,出现如下图所示的信息说明安装成功:
修改Maven本地仓库位置
通常Maven会将下载的类库(jar包)放置到本地的一个目录下(默认情况是C:我的文档中.m2.repository),如果想重新定义这个目录就需要修改Maven本地仓库的配置,这个过程也很简单,只需要四步:
第一步:在自己指定的位置处创建一个文件夹repo(名称随意),本人创建的位置是:G:ApplicationMavenrepo;
第二步:在Maven文件夹下找到conf文件夹,并找到其中的settings.xml文件,然后复制settings.xml文件放于G:ApplicationMaven,其实就是直接放在与你新建的repo文件夹同一目录:
第三步:修改这个settings.xml及前面conf文件里的settings.xml(也就是两个settings.xml文件),找到55行,修改Maven默认的仓库位置,如下图所示:
第四步:测试效果,打开dos窗口运行命令mvn help:system,出现如下图所示的信息说明配置成功(这个过程需要一定时间):
接下来介绍Maven项目的目录结构:
创建一个Maven项目
此处使用IDEA创建一个Maven项目,先在IDEA里面进行Maven的配置:
点击上面的新建图片的首页,点击Configure–>Settings:
注意这里maven的解压路径,还有如果你的maven是默认安装,那么使用默认配置即可。由于我在前面修改了Maven的配置,因此那个Maven home directory就需要设置为Maven的解压路径。注意一下这里的USer settings file,你可以使用conf目录下的settings.xml,也可以使用repo同级下的settings.xml。最后的Loacl resposity设置为你repo文件所在路径即可。按照图上所示进行配置,然后单击ok就好。
接下来正式开始创建一个Maven空白项目:
然后一直next就可以了,然后系统会自动创建项目。(GroupId是项目名称,ArtifactId是项目中某一模块的名称,Version是版本号)创建完成如图所示:(第一次使用maven可能会花一点时间,因为maven的中央仓库里面还没有文件,你需要去下载)
如果在此过程中出现c:/users/Administor/AppData/Local/Temp/archetype,请参考这篇文章:解决办法
打开里的pom.xml文件,它的作用就是配置一些jar包的引用地址:
<?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</groupId> <artifactId>mavendemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>mavendemo Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>mavendemo</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build></project>
这里面有很多,目前先关注这个:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
这个就是jar包的依赖配置,这里是配置了junit这个jar包,关于包的查找可以点这里:maven官方仓库,你需要什么就去这个网站进行搜索,然后复制dependency标签即可。groupId是仓库中生成包的路径,artifactId当前存放包的最终一个目录,version就是版本号。
下面是一些常用的maven命令:
清除命令:mvn clean(删除target,不会删除本地仓库)
编译命令: mvn compile
编译、运行、发布命令:mvn install
编译、运行、不负责发布命令:mvn package
编译、如果test包下有Java代码也会编译和运行,但也一样不会发布到本地仓库:mvn test
跳过单元测试:mvn clean package -Dmaven.test.skip=true
mvn package与mvn install的区别:主要区别就是package命令不会将target内容发布到本地仓库。(因此建议一般使用mvn install)
但是我们一般不会直接去使用这些命令,因为IDEA里面已经集成了这些命令。点击IDEA右侧的Maven Projects:
Lifecycle是Maven项目的生命周期,而Plugins则是针对第三方依赖包的管理。详细参看这篇文章:maven lifecycle 与 plugin
clean:用于清除之前构建生成的所有文件,其中具体为清除Target目录中的所有文件,包括该目录。
validate:用于验证项目是否真确,并且其说有必要信息是否都可用。
compile:编译项目的源代码,主要是java文件,一般是编译scr/main/java或是scr/test/java里面的文件。
test:用合适的测试框架来进行测试,测试compile中编译出来的代码,测试的东西一般不加包和部署。
package:获取compile中编译好的代码并将其打包成可分类的格式,如jar。
vertify:这步是用来验证test,检查test的结果是否满足标准。
install:将软件包安装到本地存储库中,确保本地其他项目可能需要使用它,也就是说某个项目被打包成jar包,必须先install才能被引入使用。(例如,装了core才能用oms)。
一般都是先clean,后complie,再package,接着install,最后deploy。
演示编译
接下来演示如何将一个项目打包为jar,在前面的app同级目录新建一个util包,在里面新建一个StringUtil.java文件:
public class StringUtil { /** * 判断字符串为空,空则返回true,反之则返回false * **/ public static boolean isEmpty(String string){ return null==string || "".equals(string); } /** * 判断字符串是不为空,空则返回false,反之则返回true * **/ public static boolean isNotEmpty(String string){ return !isEmpty(string); }}
注意此处仅仅是演示,所以不再新增其他的业务逻辑。然后点击右侧的Maven Projects,按照顺序依次运行相应命令:
然后你会发现项目结构发生了变化,左侧多了一个target文件及一个demo.jar包:
接下来新建一个Web项目,然后引入刚才的jar:
然后一直next就可以了,然后系统会自动创建项目,创建完成如图所示:(第一次使用maven可能会花一点时间,因为maven的中央仓库里面还没有文件,你需要去下载)
然后配置tomcat访问(注意使用war exploded,具体可参考IDEA中的war和war exploded的区别,说白了war是打包启动,war xxx是热启动。通俗点就是当你资源发生修改时,后者可以跟着重新启动修改,而前者需要手动启动)。
接下来便是项目文件和测试文件目录的创建:在 main 文件下面创建一个java文件夹 ,然后按照如下操作:光标移到java文件夹上面,然后右键拉到底部,找到Make Directory AS ,再单击出现的Sources Root即可,会发现该文件变成了蓝色。
紧接着在src文件下,创建mian文件的测试文件夹,名称为test,然后再在test文件夹下面新建java文件夹 ,然后按照如下操作:光标移到java文件夹上面,然后右键拉到底部,找到Make Directory AS ,再单击出现的Test Sources Root即可,会发现该文件变成了绿色。
接下来开始引入jar包,打开之前那个mavendemo项目的pom.xml文件,找到关于这个项目的描述信息:
<groupId>com.test.app</groupId> <artifactId>demo</artifactId> <version>1.0-SNAPSHOT</version>
也就是这个:
然后回到helloweb项目,打开它的pom.xml文件,找到<dependencies></dependencies>标签,新建一个<dependency></dependency>标签,将之前那三行代码放进去,然后你会发现Maven会自动导入这个文件:
你可以尝试将前面那个<dependency></dependency>标签删除,发现这jar包又没了。
然后在mian文件下的java包中新建一个Test.java,来尝试测试一下:
public class Test { public static void main(String[] args){ String a = ""; System.out.println(StringUtil.isEmpty(a)); }}
运行结果:true。说明测试通过,我们成功的引入了jar包。
如何引入本地的jar包
前面修改过Maven的本地仓库地址为:G:ApplicationMavenrepo,因此请注意你所有在pom.xml文件中配置的依赖其实已经下载到了这个文件夹下面,例如里面的的junit的配置:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
因此通过这个可以推断出这个juint文件的位置为:G:ApplicationMavenrepo junitjunit4.11,不信的话去看一下本地的目录结构:
确实如此,所以当你知道某个文件在哪里,那么你也可以配置依赖。
按照这种方式配置servlet的依赖:G:ApplicationMavenrepojavaxservletservlet-api2.5,那么您在pom.xml中的依赖配置为:
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
注意到没,我们在<groupId>中导入的是javax.servlet而不是javax,因为那样可以避免依赖层级过多,降低可读性。
登录系统演示
接下来通过Servlet来编写一个登录系统,这样能体验完整的Maven功能。
在java包下面新建一个com.test.servlet包,接着新建一个LoginServlet.java文件,让它继承HttpServlet类,并重写doGet和doPost方法(忽略导包代码)
public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletrequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置页码的字符编码集 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //获取用户提交信息 String username = request.getParameter("username"); String password = request.getParameter("password"); if(StringUtil.isNotEmpty(username) && StringUtil.isNotEmpty(password)){ request.getRequestDispatcher("/success.jsp").forward(request,response); }else{ request.getRequestDispatcher("/fail.jsp").forward(request,response); } }}
然后去web.xml文件中配置访问路由:
<web-app> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.test.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping></web-app>
接着修改index.jsp页面信息为:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %><!doctype html><html lang="zh"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>用户登录</title></head><body><h2 align="left">登录</h2><form action="/LoginServlet" method="post"> <div> <label for="username">用户名</label> <input type="text" id="username" name="username" placeholder="请输入用户名"> </div> <div> <label for="password">密码</label> <input type="password" id="password" name="password" placeholder="请输入密码"> </div> <div> <input type="submit" value="登录"> </div></form></body></html>
继续新建一个fail.jsp页面,里面的代码为:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>失败</title></head><body><h2 align="center" style="color: red">对不起,登录失败!</h2></body></html>
同样也需要新建一个success.jsp页面,里面的代码为:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>登录成功</title></head><body><h2 align="center" style="color: green">恭喜,登录成功!</h2></body></html>
然后运行项目,在浏览器地址栏中输入地址:http://localhost:8080/,发现项目测试通过。