一、在eclipse中建立工程

  在day01中我们搭建了eclipse的maven环境,接下来我们开始建立maven项目

  1.在eclipse中建立JAVA工程

    file->new->maven project,勾选 create a simple project(当然也可以选择 quickstart的模板)->next

  在上述对话框中填入坐标信息和打包方式(这里选择jar),将以下信息填入,建立工程

      groupId:com.atguigu.maven
ArtifactId:MakeFriends
Package:com.atguigu.maven

  在src/main/java中新建类com.atguigu.maven.MakeFriends (注意包与类名)

public String makeFriends(String name){
HelloFriend friend = new HelloFriend();
friend.sayHelloToFriend("litingwei");
String str = "Hey,"+friend.getMyName()+" make a friend please.";
System.out.println(str);
return str;
}

  在src/test/java中新建类com.atguigu.maven.MakeFriendsTest

package com.atguigu.maven;

import static junit.framework.Assert.assertEquals;
import org.junit.Test; public class MakeFriendsTest {
@Test
public void testMakeFriends() {
MakeFriends makeFriend = new MakeFriends();
String str = makeFriend.makeFriends("litingwei");
assertEquals("Hey,John make a friend please.", str);
}
}

//不要自己去以IDE的方式导入jUnit的包

  添加依赖信息(pom.xml)

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

//自己建一个dependcies父标签

//执行此操作时请将之前建的maven工程进行导入

  此时maven工程会生成一个maven的依赖:

  当然,我们的工程依赖HelloFriend,但是仓库中并没有这个依赖,直接编译将报错,我们必须先进行安装(关于安装的概念请参见day01):

  在HelloFriend的 pom.xml上右击->run as->maven install (控制台输出 BUILD SUCCESS即OK)

  接下来我们可以对MakeFriends进行编译了,在pom.xml上右击->run as->maven build...(第二个),goals中填编译命令 compile

  //当然,这样一直安装到仓库也是比较麻烦的,一般而言我们都是项目开发完了,最后需要打包测试了,再把需要安装的都安装一下即可。

  默认的maven工程使用的是JDK1.5,如何一劳永逸的更换JDK版本呢:(一次性的可以自己进行配置包括JDK版本和编译版本)

    [1]打开settings.xml文件
    [2]找到profiles标签
    [3]加入如下配置

<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>

  当然,由于版本问题,可能出现识别不了JDK8的问题,解决 方案可以是更换更高的maven版本,或者更换JDK版本

  在项目中设置编译版本:

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>

  2.在eclipse中建立WEB工程

  前面的步骤是一样的,建立maven工程->勾选simple project->打包方式换为war即可完成第一步的构建

    慕课网中的做法(简便):new一个maven project ,next时选择webapp的模板即可。

  但是呢,这个视图不是我们想要的web工程的视图,我们来对其进行调整

  右击项目->properties->project facts

  将动态web工程的勾暂时去掉->apply(骗eclipse说这是一个java工程)->重新勾选(目的是出现下面多出的一个链接!)

  点击该链接进行web工程的配置

//将content directory改为图中的目录

  ok->apply->ok后完成了

    到这里呢,我们仍然发现index.jsp会报错:

The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    原因就是缺少了servlet的api (当然,我们可以通过eclipse的方式:add library->server runtime的方式)

    但我们这里合理的方式应该是maven的方式:(回顾前一天provided范围的使用)

    在pom.xml中加入如下配置:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>

  //马上就不报错了 (报错时可以查看problems视图,查看具体信息)

  当然,我们这里再导入一下JSP的API,让JSP有良好的提示功能

    在pom.xml中添加如下依赖信息:

<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1.3-b06</version>
<scope>provided</scope>
</dependency>

  //范围必须是probided范围,compile范围将报错!(产生了jar包冲突)

 在eclipse中导入工程:

  导入之前建立的工程需要选择导入 maven 工程(没有settings等信息,这里只认识pom.xml),导入之后就会有附带的信息:

  之后导入就直接按照常规的import->general->existing...的JAVA形式的导入了,以后我们导入呢也是通过这种常规的方式而不通过maven的方式(没有复制工程到工作区),常规的是有的:

  【更新】:每一个骨架都会建相应的目录结构和一些通用文件,最常用的是maven-archetype-quickstart和maven-archetype-webapp骨架。maven-archetype-quickstart骨架是用来创建一个Java Project,而maven-archetype-webapp骨架则是用来创建一个JavaWeb Project。

  //在eclipse等插件使用这两套骨架

二、maven依赖的深入

  day01中我们已经对依赖有了一个初步的认识,接下来我们对maven的依赖进行进一步的理解!

  1.依赖的传递性

    我们现在之前的Hello工程中加入spring-core的jar包:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
<scope>compile</scope>
</dependency>

//当然这里会自动加入spring-core的依赖 commons-logging

    此时可以发现,HelloFriend和MakeFriends的maven依赖都有了这两个依赖,我们可以看看依赖的层次结构(Hierarchy)[pom.xml可以查看]:

  

   最上一层是直接依赖,下面的为传递依赖(其中 MakeFriends 依赖 HelloFriend 和 Hello,;HelloFriend 依赖 Hello )

  这里可以发现,最底层的模块的依赖可以向上传递,当然,这里需要指出的是,只有compile范围的才能传递,其它的范围都不能传递,被认为是

    给当前工程使用的。(可以使用一个最底层的专门来负责公用的依赖)

  当依赖找不到时,是因为maven在本地仓库中没有找到(可能没有安装),远程仓库也没有找到

  2.依赖的排除

    这里可以认为是传递的反操作,也就是用于设置依赖排除的场合(一些客观的原因,不希望一些传递进来的jar包)

    排除的操作:这里我们以排除commons-loggings为例

      打开MakeFriends的pom.xml,在HelloFriend的依赖处添加排除的配置

        (commons-logging是由spring-core引入,有Hello传递到HelloFriend再传递过来的)

      把commons-logging的坐标填入即可。(这里我们不需要去仓库找,直接在commons-logging上右击->open pom)

<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>

//会屏蔽所有版本

  这里我们可以发现,只是MakeFriends里的commons-logging没有了,其他的地方(HelloFriend等)都还存在,也就是屏蔽只是对当前工程生效的!

  当然,如果在HelloFriend就排除了,MakeFriends里的依赖当然也就没有了(半路就被排除了)

   3.依赖的原则   

      作用:解决工程之间的jar包冲突问题

      例如:MakeFriends同时收到了两个传递过来的依赖:

        MakeFriends收到俩个版本的log4j,maven如何做出选择呢?

        就近原则:路径最短者优先!

      如果非要用远路径的可以显式的声明

       如果路径一致呢?如何做出选择呢?

        先声明者优先:dependency标签的声明顺序 

  //eclipse下添加对本地工作空间maven项目的依赖可以直接在pom.xml的dependencies中点击add添加,无需手动添加坐标信息。

  4.统一管理依赖版本

    场景:一个工程中引入了spring的4.0。0的一些jar包:(这里以Hello为例,在Hello的pom.xml中配置依赖信息)

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>

    如果需要修改所有的版本为4.1.1呢,逐一地修改配置文件既容易出错,又不优雅

    解决方案:使用<properties>标签内使用自定义标签统一声明版本号

  <properties>
<atguigu-spring-version>4.0.0.RELEASE</atguigu-spring-version>
</properties>

         在需要统一版本的位置使用 ${自定义标签名}  来引用声明的版本号

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${atguigu-spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${atguigu-spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${atguigu-spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${atguigu-spring-version}</version>
</dependency>

    其实,从这里可以看出,properties配置自定义标签,不仅可以应用于统一声明版本号,还可以配置例如字符集等等的统一的归一化配置!

三、其它的概念

  maven的常见工程包括:java工程、web工程、pom工程

  继承与聚合的项目更多介绍与最佳实践请参见:http://blog.csdn.net/wanghantong/article/details/36427411

   day01中剩下的几个概念我们在这里进行补充:

  1.继承的概念

  场景:   Hello依赖的 jUnit: 4.0

      HelloFriend依赖的 jUnit: 4.0

      MakeFeiends依赖的 jUnit: 4.9

    以此为例是由于 jUnit的范围是test范围,没有传递性,属于比较离散的,很容易造成版本问题

  解决方案:将 jUnit 的依赖统一提取到 “父工程” 中,子工程中声明 jUint 时不指定版本,以父工程中的统一设定为准(这样修改也方便了)

  具体操作:

    >创建一个maven工程作为父工程,注意:打包方式不是jar或war,而是pom

    >在子工程中声明对父工程的引用

<!-- 声明对父工程的引用 -->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前文件为基准的父工程的pom文件的相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>

      //其它工程也要声明

    >将子工程的坐标与父工程坐标中重复的内容删除

      继承为了消除重复,我们把很多相同的配置提取出来,例如:grouptId,version等

      我们将上面的配置完成后,将会出现如下警告信息:

      Version is duplicate of parent version =也就是有重复的地方

      我们把重复的两行删掉即可!

      //三个文件全部去掉警告的重复信息即可

    >在父工程中使用 <dependencyManagement> 统一声明管理 jUnit 的依赖

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

    >在子工程中删除 jUnit 的版本号

      此时在子工程中会看到警告信息:父工程中已经进行了管理,你是否要进行重写

      我们删除三个子工程的版本号信息即可。

  注意:配置继承后,要执行安装操作时,需要先安装父工程

  2.聚合的概念

   上面的继承需要安装时,有安装的顺序要求,比较复杂

    聚合的作用:一键安装

    具体操作:

      在一个总的“聚合”工程中进行配置各个参与聚合的模块——可以父工程(大部分也都是这个方式,和父工程配置在一起)

      在Parent的pom.xml中配置:

 <!-- 配置聚合 -->
<modules>
<!-- 指定各个子工程的相对路径 -->
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>

    测试:这里我们把F:\maven\repository\com\atguigu\maven下已经安装的Hello,HelloFriend删掉,在父工程的pom.xml上右键执行安装

    控制台的信息可以看到安装顺序:

  //这个顺序是我们配置的依赖顺序,maven会智能的调整顺序,即使配置时依赖顺序不按依赖的写也是可以的。

四、web工程的自动部署

  一个web工程呢我们可以通过执行打包操作,打包成war包,将war包放在tomcat的webapps下,然后启动 tomcat ,它会自动把war包解压成目录的形式,就可以通过浏览器访问了,当然,这是我们手动的操作。

  如何通过maven操作呢,在web工程MavenWebProject(之前建立的web项目)中的pom.xml中进行配置:

<!-- web工程的自动部署配置 -->
<build>
<finalName>AtguiguWeb</finalName>
<!-- 配置构建过程中使用的插件 -->
<plugins>
<plugin>
<!-- cargo是专门从事启动servlet容器的组织 -->
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.3</version>
<configuration>
<!-- 配置当前容器的位置 -->
<container>
<containerId>tomcat7x</containerId>
<home>F:\tomcat\apache-tomcat-7.0.75</home>
</container>
<configuration>
<type>existing</type>
<home>F:\tomcat\apache-tomcat-7.0.75</home>
<!-- 如果Tomcat端口为默认值8080则不必设置该属性 -->
<!-- <properties>
<cargo.servlet.port>8989</cargo.servlet.port>
</properties> -->
</configuration>
</configuration>
<!-- 配置插件在什么情况下执行 -->
<executions>
<execution>
<id>cargo-run</id>
<!-- 生命周期的阶段 -->
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

  然后执行 run as->maven build...->goals:deploy(可以同时运行多个,使用空格分隔即可 clean compile)

  测试:在浏览器中输入http://localhost:8080/AtguiguWeb/就可以正常访问了

  //日志信息乱码这里暂且不讨论(在命令行正常显示)

  但是这里不方便停止:

  这里eclipse中按ctrl+c不管用,即使按了红框也不行(可以试试按了再启动tomcat也会报端口被占用的问题)

    这里停止方式可以是:在命令行进入项目的路径(先进盘 cd,再进目录),再执行部署操作J(mvn deploy),

    再在命令行按ctrl+c进行停止(报错暂时不管)

  可以发现这种方式比较复杂,我们还是比较习惯在eclipse中操作(右键run on server)(不推荐这种在命令行中的操作)

五、查找依赖信息的网址

  http://mvnrepository.com/

    在ide中可以直接点击dependcies的add,选择搜索框可以搜索到坐标,并可以点击属性进行版本,范围等属性的具体配置

maven第二天——重要概念与其它操作的更多相关文章

  1. 高并发第二弹:并发概念及内存模型(JMM)

    高并发第二弹:并发概念及内存模型(JMM) 感谢 : 深入Java内存模型 http://www.importnew.com/10589.html, cpu缓存一致性 https://www.cnbl ...

  2. 原创】Java并发编程系列2:线程概念与基础操作

    [原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...

  3. 【Java EE 学习 82 下】【MAVEN整合Eclipse】【MAVEN的一些高级概念】

    一.MAVEN整合Eclipse MAVEN是非常优秀,但是总是要开命令行敲命令是比较不爽的,我们已经习惯了使用IDE,所以还有一种将MAVEN整合到Eclipse的方法. 详情查看:http://w ...

  4. maven使用.02.一些概念

    在上一篇POST中,简要的介绍了一下maven的特点,优势,安装.并建立了一个简单地Hello world工程.这一篇POST中,将主要会介绍一下Maven的一些约定. pom.xml文件 Maven ...

  5. 从零开始使用git第二篇:git的日常操作

    从零开始使用git 第二篇:git的日常操作 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:git撤销操作.分支操 ...

  6. Elasticsearch第二篇:基本概念和基础操作

    上一篇文章,我们已经是在Windows10 上搭建了 Elasticsearch 环境已经安装了相关的插件,现在我们就可以像操作webapi一样简单的操作 ElasticSearch 了,有园友说可以 ...

  7. maven用途、核心概念、用法、常用参数和命令、扩展

    设置问题解决. http://trinea.iteye.com/blog/1290898 本文由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Buil ...

  8. Ant,Maven与Gradle的概念的理解

    转载地址:http://www.jianshu.com/p/cd8fe9b16369# 我们还是以AndroidStudio 2.1.1为例来讲. 用AndroidStudio就逃不开跟Gradle打 ...

  9. 第二十一课:js属性操作的兼容性问题

    上一课主要讲了属性的概念,用法,固有属性和自定义属性的区别,class属性操作的方法等,这一课主要讲一些有关属性操作的兼容性问题. IE6-IE8在一些表示URL的属性会返回补全的改过编码的路径,比如 ...

随机推荐

  1. 切片和append操作

    本文转自:http://meia.fun/article/1541470004286 学习切片时,被append这个方法困扰了半天:在main方法中把一个切片作为实参传递给另一个函数,并在这个函数内调 ...

  2. jQuery1.7版本之后的on方法

    之前就一直受这个问题的困扰,在jQuery1.7版本之后添加了on方法,之前就了解过,其优越性高于 live(),bind(),delegate()等方法,在此之前项目中想用这个来测试结果发现,居然动 ...

  3. 转: C# 的结构剖析

    原文链接:http://www.cnblogs.com/jiajiayuan/archive/2011/09/20/2181582.html 本文意在巩固基础知识,并不是对其进行深入剖析,还望理解.本 ...

  4. python下载指定的版本包

    首先我们很多时候在执行pip的时候是不行的  有时候很难成功,这个时候我们就要想其他的版本了 一.是不是这个包需要指定版本, 比如python2的和mysql链接的是,而python3则是mysqlc ...

  5. Flask 参数简介

    我们都知道学习了Flask的时候它里面的参数是有很多种的参数  都是需要相互进行调用传递的  今天就简要分析一些常见的参数 首先导入Flask之后看 源码 from flask import Flas ...

  6. 2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果

    跟踪标记:3604 功能: 输出DBCC命令返回结果到查询窗口(通常是SSMS窗口),类似print命令的显示效果: 用途: 常用于获取DBCC IND, DBCC PAGE命令的输出结果,因为这2个 ...

  7. linuxGame:文明5汉化

    此包来源苹果戏台的steam平台 参考网页: 1.https://tieba.baidu.com/p/4529797745 2.http://www.civclub.net/bbs/forum.php ...

  8. 魅力python------if - else 语句

    引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...

  9. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  10. Hibernate查询(HQL——Hibernate Query Language)

    HQL查询 HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: ...