文章目录
- 一、项目分层
- 二、当前项目村存在的问题
- 三、Maven
- 3.1 概念
- 3.2 构建
- 3.3 构建过程中的各个环节
- 3.4 自动化构建
- 3.5 安装Maven核心程序
- 3.6 Maven的核心概念
- 3.7 第一个Maven工程
- 3.8 常用Maven命令
- 3.9 联网的问题
- 3.10 POM
- 3.11 坐标(GAV)
- 3.12 仓库
- 3.13 依赖
- 3.14 生命周期
- 四、一些其他配置
- 4.1 使用阿里云镜像
- 4. 2 配置本地仓库
- 4.3 引用中央仓库地址
- 五、idea下创建Maven项目
- 5.1 执行Maven命令
- 5.2 执行其他命令
- 5.3 jar包冲突
- 六、出错
- 七、其他配置
- 7.1 配置tomact7,并改变端口
- 7.2 idea下创建tomcat7模板
- 7.4 配置jdk1.8插件
- 7.5 xml头部文件
- 八、maven工程解决jar包冲突问题
- 8.1 方式一
- 8.2 常见面试题
- 8.3 新版本maven
一、项目分层
1.1表示层
- 视图层
h5/css/js/jsp - 控制层
servlet/Action/Handler
负责接收请求参数,处理请求,返回响应,跳转页面
1.2业务逻辑层
Spring IOC AOP
1.3 持久化层
调用数据库
JDBC/DBUtils/Spring JDBCTemplate/Hibernate(常用)/Mybatis Mys
二、当前项目村存在的问题
2.1 问题
- 一个项目就是一个工程
项目太大用package划分太麻烦,太多,不好管理,最好是每一个模块对应一个工程借助maven将一个maven划分成多个模块 - 需要手动复制粘贴jar包
同样的jar包出现在不同的项目工程中,浪费存储空间,借助maven,将jar包存在仓库中,需要使用的工程引用这个文件接口即可。并不需要去复制。 - 一个jar包依赖的其他jar包需要我们手动添加
jar包需要别人为我们准备好,或者去官网下载,不同技术的官网痛过maven或者svn等专门工具提供下载的,借助于Maven我们可以以一种规范的方式下载jar包,因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在Maven的中央仓库中。
Tips:统一的规范
三、Maven
3.1 概念
maven是一个项目管理工具
- 依赖管理
maven对项目中的jar包进行管理。把jar包放到仓库中,项目中只放jar包的坐标。 - 一键构建
maven自身集成了tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作。
3.2 构建
- 概念:以“java源文件”,“框架配置文件”,“JSP”,“HTML”,"图片“等资源作为原材料,去生产一个可以运行的项目的过程。
编译
部署
搭建 - 编译:java源文件–>编译–>class字节码文件–>交给jvm去执行
- 部署:一个BS项目最终运行的不是动态web本身,而是这个web工"程编译的结果",当我们需要通过浏览器访问java程序时就必须将包含java程序的web工程编译的结果拿到服务器上的指定目录下,并启动服务器才行,这个拿的过程我们叫做部署。
3.3 构建过程中的各个环节
- 清理
将以前编译得到旧的class字节码删除,为下一次编译做准备 - 编译
将Java源程序编译成class字节码文件 - 测试
自动测试,自动调用jUnit程序 - 报告
测试程序执行的结果 - 打包
动态web工程打包,java工程打包 - 安装
Maven特定的概念,将打包得到的文件复制到“仓库中”指定的位置 - 部署
将动态Web工程生成的war包复制到servlet容器指定的目录下,使其可以运行
3.4 自动化构建
3.5 安装Maven核心程序
-
检查java_home环境变量
-
解压Maven程序核心的压缩包,放在非中文无空格的路径下
-
配置Maven环境变量
MAVEN_HOME -
运行mvn -v查看maven版本
3.6 Maven的核心概念
- 约定的目录结构
- POM
- 坐标
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
3.7 第一个Maven工程
创建约定的目录结构
- 根目录:工程名
- src目录:源码
- pom.xml文件:Maven工程的核心配置文件
- main目录:存放主程序
- test目录:存放测试程序
- java目录:存放java源文件
- resources目录:存放框架或其他工具的配置文件
3.8 常用Maven命令
注意:
执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录,与构建过程相关:编译,测试,打包…
mvn clean | 清理 |
---|---|
mvn compile | 编译 |
mvn test-compile | 编译测试程序 |
mvn test | 执行测试 |
mvn package | 打包 |
- package
将项目打包到target目录下。
- install
将包安装到本地仓库- deploy
本地做好的项目打包上传到私服
3.9 联网的问题
- Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成,而插件本身并不在Maven的核心程序中。
- 执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找
- 本地仓库默认的位置:系统中当前用户的家目录:.m2\repository,比如:
C:\Users\ybx\.m2\repository
- Maven核心程序如果在本地仓库中找不到需要的插件,那么他会自动连接外网,到中央仓库中下载
- 如果连接网络失败,构建失败
- 修改本地仓库默认的位置可以让Maven核心程序到我们事先准备好的目录下查找文件
找到maven解压目录\conf\setting.xml
在setting.xml文件中找到
将标签体内容修改为已经准备好的Maven仓库目录
<localRepository>D:\software\config\RepMaven.zip</localRepository>
3.10 POM
- Project Object Model
项目对象模型 - pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置,重要程度相当于web.xml对于动态web工程。
3.11 坐标(GAV)
用三个向量在仓库中定位一个工程
- groupid :公司或组织于明+项目名
- artifactid:模块名
- version:版本名
Maven工程的坐标与仓库中路径的对应关系
3.12 仓库
- 仓库的分类
本地仓库
当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务。远程仓库
私服:假设在当前局域网环境下,为当前局域网范围内的所有Maven服务。链接外网下载jia包存储到私服上,供多个用户使用。中央仓库:架设在Internet上,为全世界Maven工程服务
中央仓库镜像:为了分担中央仓库的流量,提高用户访问速度。
- 仓库中保存的内容
- Maven自身所需要的插件
- 第三方框或者工具的jar包。
- 我们自己开发的Maven工程
- 仓库之间的关系
在公司中,如果本地没有对应的jar包,会先从私服中去寻找jar包,如果私服(远程仓库)中没有,会从中央仓库中下下载,也可以从本地上传。
- 第三方
- 第一方:jdk
- 第二方:我们
- 软件版本阶段说明:https://www.cnblogs.com/lanmiao/articles/2184282.html
按住shift–>鼠标右键在此处打开cmd,直接定位到当前目录下
3.13 依赖
-
Maven解析依赖信息时,会到本地仓库中查找被依赖的jar包,对于我们自己开发的Maven工程,使用Install命令安装后就可以进入仓库。
-
依赖的范围
compile
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:参与打包
-
test范围依赖
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与打包
*典型的例子:junit
-
provided范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与打包
- 是否参与部署:不参与部署
- 典型的例子:servlet.api.jar
3.14 生命周期
- 清理生命周期
- 默认生命周期
compile到deploy过程 - 站点生命周期
四、一些其他配置
4.1 使用阿里云镜像
config–>setting.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4. 2 配置本地仓库
<localRepository>D:\software\config\RepMaven</localRepository>
4.3 引用中央仓库地址
百度Maven中央仓库–>搜索servlet–>随便粘贴一个版本,实例如下:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1-b03</version>
<scope>provided</scope>
</dependency>
五、idea下创建Maven项目
5.1 执行Maven命令
Maven Projects–>Lifecycle
5.2 执行其他命令
5.3 jar包冲突
我们导入的包与Maven中自带的包冲突了,我们只需在编译时期使用我们调导入的包,我们可以设置jar包的作用域,provide作用域的作用是让jar包在编译时期起作用,在项目实际运行时不起作用。junit让他只在测试时起作用。
六、出错
context: /jsf2nd
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
javax.faces.webapp.FacesServlet
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1128)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1026)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4421)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4734=
原因:servlet文件没有放在java目录下,而是放在了其他目录下
七、其他配置
7.1 配置tomact7,并改变端口
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8844</port>
</configuration>
</plugin>
</plugins>
7.2 idea下创建tomcat7模板
-
file–>settings–>搜索live
-
右边加号–>template group(创建组名)–>live template(创建动态模板)
-
创建好模板后,选择模板生效的文件类型,选Define,再选文件类型即可
-
在对应文件中写上模板名,就可以自动调用
7.4 配置jdk1.8插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>utf-8</encoding>
</configuration>
</plugin>
7.5 xml头部文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
八、maven工程解决jar包冲突问题
8.1 方式一
第一声明优先原则
8.2 常见面试题
8.3 新版本maven
- 新版本maven可能会版本不兼容,建议使用低版本的maven。