maven入门

1、maver问题引入:

 1.1、假如你正在Eclipse下开发两个Java项目,把它们称为项目A和B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?很简单,这不就是跟我们之前写程序时一样吗,需要用哪个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包即可。所以这里也如此,可以将B项目打成jar包,然后在A项目的Library下导入B的jar文件,这样,A项目就可以调用B项目中的某些类了。这样做几种缺陷如果在开发过程中,发现B中的bug,则必须将B项目修改好,并重新将B打包并对A项目进行重编译操作,在完成A项目的开发后,为了保证A的正常运行,就需要依赖B(就像在使用某个jar包时必须依赖另外一个jar一样),两种解决方案,第一种,选择将B打包入A中,第二种,将B也发布出去,等别人需要用A时,告诉开发者,想要用A就必须在导入Bjar包。两个都很麻烦,前者可能造成资源的浪费(比如,开发者可能正在开发依赖B的其它项目,B已经存储到本地了,在导入A的jar包的话,就有了两个B的jar),后者是我们常遇到的,找各种jar包,非常麻烦(有了maven就不一样了)

1.2、我们开发一个项目,或者做一个小demo,比如用SSH框架,那么我们就必须将SSH框架所用的几十个依赖的jar包依次找出来并手动导入,特别繁琐。 

上面两个问题的描述,其实都属于项目与项目之间依赖的问题[A项目使用SSH的所有jar,就说A项目依赖SSH],人为手动的去解决,很繁琐,也不方便,所以使用maven来帮我们管理

2、maven是什么:

Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具【百度百科】,Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,而这里pom.xml文件对于学了一点maven的人来说,就有些熟悉了,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?等等类似问题我们需要搞清楚,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了(通过pom.xml添加jar包)。所以,根据上一段的描述,我们最终的目的就是学会如何在pom.xml中配置获取到我们想要的jar包,在此之前我们就必须了解如何创建maven项目,maven项目的结构是怎样,与普通java,web项目的区别在哪里,还有如何配置pom.xml获取到对应的jar包等等,这里提前了解一下我们如何通过pom.xml文件获取到想要的jar的,具体后面会详细讲解该配置文件。

pom.xml获取junit的jar包的编写。

<dependencies>//所有依赖的jar统一放在这里面 // 所依赖的jar,这里编写的是某个具体jar <dependency> //通过这三个属性定位一个jar包 <groupId>junit</groupId>//一般是包名,也就是域名的反写 <artifactId>junit</artifactId>//项目名 <version>3.8.1</version>//所需要的jar包版本 <scope>test</scope>//表示jar包只在测试时用 </dependency> <dependency> ..............//所需要的jar包写在dependency下面 </dependency> ...... ...... </dependencies>

为什么通过groupId、artifactId、version三个属性就能定位一个jar包?

加入上面的pom.xml文件属于A项目,那么A项目肯定是一个maven项目,通过上面这三个属性能够找到junit对应版本的jar包,那么junit项目肯定也是一个maven项目,junit的maven项目中的pom.xml文件就会有三个标识符,比如像下图这样,然后别的maven项目就能通过这三个属性来找到junit项目的jar包了。所以,在每个创建的maven项目时都会要求写上这三个属性值的。目的是为了别人能通过这三个属性找到自己。

3、maven安装

参考:https://zhuanlan.zhihu.com/p/62731238

目的为了使用命令行创建maven项目,和使用命令行操作maven项目

4、什么是仓库

首次运行完mvn -version后,会在用户目录下创建一个.m2的目录(比如:C:\Users\当前用户名\.m2\),这个目录是maven的“本地仓库”,仓库是maven中一个很重要的概念。

仓库分为:本地仓库、第三方仓库(私服)、中央仓库

4.1、本地仓库

Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,每个电脑默认的仓库是在 $user.home/.m2/repository下

一般我们都会修改本地仓库位置,新建一个文件夹,从网上下载的所有jar包,都丢到本地仓库中,也就是这个文件夹中,然后每次写项目,直接从本地仓库里取。

现在自己想建立的仓库地址的路径下新建文件夹,例如我的是:F:\eclipse-jee-neon-1a-win32-x86_64\maven\repository。找到配置文件,也就是下载解压好的maven文件夹,

打开setting.xml文件

将<localRepository></localRepository>这行修改成自己已经建好的路径,如下

检验下是否已经设置成功:控制台输入 mvn help:system,会看到在下载很多文件或jar包,执行完该命令,查看仓库路径下是否新增了很多文件,如果是,那么maven已经设置完成,另外,这个本地仓库可以理解为“缓存”,缓存的就是jar包,开发项目时,如果用maven新建项目,我们添加需要的jar包,它会先从本地仓库检索是否存在,如果没有的话会从远程仓库(中央仓库)中去下载,然后再缓存到之前配置好的本地仓库中。

4.2、第三方仓库

          第三方仓库,又称为内部中心仓库,也称为私服

          私服:一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(使用私服为了减少对中央仓库的访问

          私服可以使用的是局域网,中央仓库必须使用外网

          也就是一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。

注意:连接私服,需要单独配置。如果没有配置私服,默认不使用

4.3、中央仓库

     Maven内置了远程公用仓库:http://repo1.maven.org/maven2

     这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了 世界上大部分流行的开源项目构件。目前是以java为主

     工程依赖的jar包如果本地仓库没有,默认从中央仓库下载

4 .4配置代理服务器(可选)

maven项目在编译、测试、打包里,会需要从maven的中央仓库(即:maven组织公布在互联网上的一个站点,里面已经收录了目前绝大多数主流的jar包)下载jar包等文件,如果使用代理服务器上网,需要配置代理服务器。

把%MAVEN_HOME%\conf\settings.xml复制一份到本地仓库C:\Users\当前用户名\.m2\下,然后编辑该文件,找到下面这段

<proxies> <!-- proxy | Specification for one proxy, to be used in connecting to the network. | <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>proxyuser</username> <password>proxypass</password> <host>proxy.host.net</host> <port>80</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> --> </proxies>

把注释去掉,host这里填写代理服务器的地址(可以用IP)以及port端口,如果需要用户名/密码认证,则填写username/password节点,否则username/password这二个节点去掉,nonProxyHosts表示某些地址不需要经过代理服务器,多个地址之间用|分隔,支持通配符,比如172.156.*

5、使用命令行管理maven项目

5.1、创建maven java项目

    自己创建一个文件夹,在该文件夹下按shift+右击,点开使用命令行模式,这样创建的maven[java]项目就在该文件夹下了(win10需要先打开Powershell窗口,然后输入start cmd)。

    命令:mvn archetype:generate -DgroupId=com.wuhao.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

    mvn:核心命令

    archetype:create:创建项目,现在maven高一点的版本都弃用了create命令而使用generate命令了。

  -DgroupId=com.wuhao.maven.quickstart :创建该maven项目时的groupId是什么,该作用在上面已经解释了。一般使用包名的写法。因为包名是用公司的域名的反写,独一无二

   -DartifactId=simple:创建该maven项目时的artifactId是什么,就是项目名称

   -DarchetypeArtifactId=maven-archetype-quickstart:表示创建的是[maven]java项目

   运行的前提:需要联网,必须上网下载一个小文件

命令执行完后会在文件夹下创建一个项目,该文件就是我们的maven java项目,项目里面只要src文件夹和pom.xml文件,编译过后会增加一个target文件夹(命令: mvn compile)

图中有一个target目录,是因为将该java项目进行了编译,src/main/java下的源代码就会编译成.class文件放入target目录中,target就是输出目录。

5.2 、创建 maven web 项目

命令:mvn archetype:generate -DgroupId=com.wuhao.maven.quickstart -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot

   其他都差不多,创建maven web项目的话 -DarchetypeArtifactId=maven-archetype-webapp 比创建java项目多了一个 -Dversion=0.01-snapshot, 在创建java项目的时候也可以加上这个,如果不写,会默认帮我们加上1.0-snapshot。

5.3、命令操作maven java或web项目

  编译:mvn compile  --src/main/java目录java源码编译生成class (target目录下)

  测试:mvn test    --src/test/java 目录编译

  清理:mvn clean    --删除target目录,也就是将class文件等删除

  打包:mvn package  --生成压缩文件:java项目#jar包;web项目#war包,也是放在target目录下

  安装:mvn install   --将压缩文件(jar或者war)上传到本地仓库

  部署|发布:mvn deploy  --将压缩文件上传私服

5.4、项目打包

通常我们会把java项目打包成jar包或war包,maven中打包的命令为

mvn clean package

运行完后,会在target目录下生成jar包

注:从输出 可以发现,package前,会先执行compile,再执行test,最后才是package打包

5.5、项目运行

该项目中的App.java中有main方法,可以直接运行,常规方式下,我们如果想直接运行class文件,得敲一段很长的命令,maven中不必这么复杂,先用记事本打开项目根目录下的pom.xml文件,增加下面这节内容:

<build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <argument>-classpath</argument> <classpath> </classpath> <argument>cnblogs.App</argument> </arguments> </configuration> </plugin> </plugins> </build>

上述这段内容插入在</project>之前即可。

然后在命令行下,输入

mvn exec:exec

即可直接运行

5.6、项目部署

如果是web项目,使用命令

mvn clean jboss-as:deploy

就能自动将web项目部署到jboss中(前提是jboss web server已经成功启动),因为刚才我们创建的是一个最基本的maven项目,并非web项目,所以执行这条命令,应该会失败,后面会讲如何在eclipse中用插件部署web项目,这里可以先跳过。

另外:

有时候,我们的项目是一个类库,只是封装一些方法供其它项目引用,对于这种项目,我们可以用 mvn clean install 把生成的jar包,安装到“本地仓库”中,这样本机其它项目需要使用该jar包时,只要在pom里配置依赖项即可,不用把jar包复制到当前项目中。

6、eclipse中集成maven

6.1、修改eclipse中使用的maven版本

eclipse自带了maven3.0.4,如果想使用最新的3.1.1,可以在eclipse -> window -> perferences -> Maven -> Installations 里参考下图设置一下

配置setting及仓库

7、创建项目

使用maven新建项目有两种方式,一种是在eclipse上直接新建,一种是通过控制台新建好项目的一些基本信息并生成一个Eclipse项目文件后导入

1,eclipse上直接新建

创建后初始界面:

第二种方式在文中开始的时候就介绍了。

实际使用中,发现eclipse与maven之间并非整合得天衣无缝,有时候eclipse中项目图标经常会莫名其妙的出现一些红叉,以下是一些个人经验:

a) 尝试先到Dos命令行窗口,用mvn clean compile(或install)之类的命令试下能否正常编译 如果a) 步骤能正常编译,在回到eclipse中,项目右击->Maven-Update Project ,通常这样就能消除红叉 有时候b)步骤操作完以后,仍然会有红色感叹号或红叉,但是eclipse编译、调试都OK,这就要具体问题具体分析了,可以尝试把Problems面板调出来,逐个分析以上3个步骤都尝试无效后,最后还可以尝试 Windows -> Preferences -> Validation -> Disable All 把所有验证都关掉