00【补充】项目的打包方式
1. 目地
把项目放到tomcat里面去运行
2. 方式1【不推荐】
直接把WebRoot里面的内容放到tomcat的webapps里面
缺点
如果项目有依赖于非WEB-INF/bin里面的jar包。那么不会被引入
3. 方式2【推荐】
再把war包放到tomcat的webapps里面去运行
01【熟悉】maven概述
1,定义
1,Maven 作为 Apache 的一个开源项目,旨在给项目管理提供更多的支持,它最早的意图只是为了给 apache 组织的几个项目提供统一的开发、测试、打包和部署,能让开发者在多个项目中方便的切换。
2,Maven 中最值得称赞的地方就是使用了标准的目录结构和部署。
3,在多个开发团队环境的情况下,Maven可以设置标准。由于大部分的项目设置简单可重复使用,使使Maven开发容易,创建报告,检查,生产和测试完全自动化设置。
4,maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
5,maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
2,基本原理
Maven 的基本原理很简单,采用远程仓库和本地仓库以及一个类似 build.xml 的 pom.xml ,将 pom.xml 中定义的 jar 文件从远程仓库下载到本地仓库,各个应用使用同一个本地仓库的 jar ,同一个版本的 jar 只需下载一次,而且避免每个应用都去拷贝 jar 。
同时它采用了现在流行的插件体系架构,只保留最小的核心,其余功能都通过插件的形式提供,所以 maven 下载很小,在执行 maven 任务时,才会自动下载需要的插件。
mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
此时,B Repository被称为A Repository的镜像。如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。
< mirrors/>是镜像列表,是maven从远程仓库里下载构件的一组服务器镜像。镜像能减轻中央maven库的负载,也能突破代理等的网络环境的限制,每个仓库都有一个ID,而mirror需要和仓库的ID对应。
3,坐标
(1)定义
坐标用来标识时空中的某个点,方便人们找到位置,如中电信息大厦可以用经纬度坐标找到,也可以通过国家、省市区、街道、门牌组成的坐标去找。
(2)分类
groupId: 组织ID,一般是公司、团体名称
artifactId:实际项目的ID,一般是项目、模块名称
version:版本,开发中的版本一般打上 SNAPSHOT 标记
4,特点
1,依赖管理是maven的一大特征,对于一个简单的项目,对依赖的管理并不是什么困难的事,但是如果这个项目依赖的库文件达到几十个甚至于上百个的时候就不是一个简单的问题了。在这个时候maven对于依赖管理的作用就显露出来了。
2,传递性依赖是在maven2中添加的新特征,这个特征的作用就是你不需要考虑你依赖的库文件所需要依赖的库文件,能够将依赖模块的依赖自动的引入。
3,由于没有限制依赖的数量,如果出现循环依赖的时候会出现问题,这个时候有两种方式处理,一种是通过 build-helper-maven-plugin 插件来规避,另一种就是重构两个相互依赖的项目。
4,通过传递性依赖,项目的依赖结构能够很快生成。Maven 能够解决依赖传递
5,传递依赖中需要关注的就是依赖调解,依赖调解的两大原则是:最短路径优先和第一声明优先
6,maven有三套classpath(编译classpath,运行classpath,测试classpath)分别对应构建的三个阶段。依赖范围就是控制依赖与这三套classpath的关系。
7,依赖范围有六种:
compile:编译依赖范围,在三个classpath都有效。
test:测试依赖范围,在编译代码和运行代码是无效。
provided:以提供的依赖范围,在编译和测试的时候有效,在运行的时候无效。例如servlet-api,因为容器已经提供,在运行的时候是不需要的。
runtime:运行时依赖范围,仅在测试和运行的时候有效。例如jdbc只有在测试和运行的时候才有效。
system:系统依赖范围,与provided范围一致,但是依赖是通过系统变量来指定依赖,不利于移植。
5,三级仓库结构
(1)远程公用仓库
Maven 内置了远程公用仓库: http://repo1.maven.org/maven2 这个公用仓库也叫中央仓库是由 Maven 自己维护,包好了世界上大部分流行的开源项目构件。
(2)内部中央仓库
也称私有共享仓库(私服)。一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可以作为公用类库镜像缓存,减少在外部访问和下载的频率。
(3)本地仓库
Maven 会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,通常默认在 $user.home/.m2/repository 下。
02【掌握】eclipse集成maven插件
Jdk的配置
1,下载maven服务器
解压
2,配置环境变量
3,测试
4,maven的配置
配置文件的址
..maven/conf/settings.xml
配置本地库存
配置镜像地址
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> |
Maven项目的JDK配置
<profile> <id>jdk1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> |
5,在eclipse下安装插件
打开sts
Window-Perferences/maven
Jdk的修改
-Dmaven.multiModuleProjectDirectory=MAVEN_HOME(注意前面的-不可省略)
03【掌握】eclipse下创建java项目
创建项目
项目目录 说明
依赖pom.xml
依赖排除pom.xml
依赖范围pom.xml
依赖范围—本地jar pom.xml
04【掌握】eclipse下maven项目聚合依赖
1. 项目与项目的依赖
可以用来抽取不同的项目的公共部分
2. 项目继承1
创建03_maven_parent
打包方式是pom
修改03_maven_parent的pom.xml
<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.sxt</groupId> <artifactId>03_maven_parent</artifactId> <version>1.0</version> <packaging>pom</packaging>
<!-- 全局常量配置 --> <properties> <spring.version>4.3.24.RELEASE</spring.version> </properties> <!-- 依赖配置 --> <dependencies> <!--spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version>
</dependency> <!-- javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
</dependencies> </project> |
创建03_maven_children的pom.xml
打包方式是jar
总结
当父项目依赖了包之后,子项目只要继承当前这个父项目,就拥有的父项目依赖的所有包
3. 项目继承2
修改03_maven_parent
修改03_maven_children
总结
在父项目里面使用dependencyManagement来管理依赖,那么在子项目继承父项目的时候 子项目不能直接得到依赖,而要主动声明需要的依赖,不能指定版本号
如果父项目里面没有。那么必须指定版本号
4. 项目聚合
以JD为例按模块功能分
https://www.jd.com 路由系统
|-- https://imall.jd.com/ 192.168.11.110
|-- https://chongzhi.jd.com 192.168.11.111
|-- https://help.jd.com/index.html 192.168.11.112
|-- https://channel.jd.com/home.html 192.168.11.113
|-- https://jiadian.jd.com/ 192.168.11.114
|-- https://miaosha.jd.com 192.168.11.115
|-- https://passport.jd.com/uc/login? 192.168.11.116
|-- https://cart.jd.com/cart.action 192.168.11.117
|--图片服务器
为什么这么分
解决高可用的问题
每个系统可以部署在不同的服务器上
以按三层结构
com.sxt.domain
com.sxt.mapper
com.sxt.service
com.sxt.controller
汽车出租
common 项目
carrent ---父项目 打包形式pom project 依赖common
|--carrent-domain 实体项目 继承carrent 打包形式jar module
|--carrent-mapper
|--访问数据库的项目 继承carrent
|--打包形式 jar
|--依赖 carrent-domain
|--carrent-service
|--提供服务的项目
|--打包形式jar
|--依赖carrent-mapper
|--carrent-controller
|--web项目层 打包形式war
|--依赖carrent-service
电商
模块 前端项目 购物车系统 后台管理系统 单点登陆系统 缓存系统
总项目 pom
|--公共模块 common
|--前端项目 pom
|--domain
|--mapper
|--service
|--web
|--购物车系统 pom
|--domain
|--mapper
|--service
|--web
|--后台管理系统 pom
|--domain
|--mapper
|--service
|--web
|--单点登陆系统 pom
|--domain
|--mapper
|--service
|--web
|--缓存系统 pom
|--domain
|--mapper
|--service
|--web
05【掌握】eclipse下创建maven的WEB项目
创建项目
解决其它源码包不显示的问题
重要的
Src/main/java
Src/main/resources
结构说明
Webapps----àWebRoot
修改pom.xml
引入servlet
引入jsp
引入jstl
<properties> <jsp.version>2.2</jsp.version> <servlet.version>3.1.0</servlet.version> <jstl.version>1.1.2</jstl.version> </properties>
<dependencies> <!-- jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <!-- javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency>
<!-- taglibs/standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>${jstl.version}</version> </dependency>
</dependencies> |
配置tomcat插件
<build> <finalName>01_maven_web_hello</finalName> <plugins> <!-- 配置tomcat的运行插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 配置端口 --> <port>8080</port> <!-- 配置urlencoding --> <uriEncoding>UTF-8</uriEncoding> <!-- 配置项目的访问路径 --> <path>/bjsxt</path> </configuration> </plugin>
</plugins>
</build> |
配置jdk版本[选择性配置]
<!-- 配置jdk的编译版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <!-- 指定source和target的版本 --> <source>1.8</source> <target>1.8</target> </configuration> </plugin> |
运行
修改servlet的版本
原来的项目servlet版本是2.3 想变成3.1
@WebServlet
@Filter
@Linstener
1, 删除web.xml
2, 右键项目 properties àproject facets
3, 先去掉Dynamic Web Module 前面的复选 再apply
4, 再选版本为3.1
5, 再勾复选
6, 点击如下图的链接
7, 创建web.xml
07【掌握】使用maven重构springmvc的项目
创建项目
导入依赖
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sxt</groupId> <artifactId>0520carrent</artifactId> <packaging>war</packaging> <version>1.0</version> <name>0520carrent Maven Webapp</name> <url>http://maven.apache.org</url> <!-- 声明版本 --> <properties> <jsp.version>2.2</jsp.version> <servlet.version>3.1.0</servlet.version> <jstl.version>1.2</jstl.version> <standard.version>1.1.2</standard.version> <spring.version>4.3.24.RELEASE</spring.version> <mybatis.version>3.5.2</mybatis.version> <mybatis.spring.version>1.3.3</mybatis.spring.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.19</druid.version> <pagehelper.version>5.1.10</pagehelper.version> <quartz.version>2.2.0</quartz.version> <jackson.version>2.9.9</jackson.version> <fileupload.version>1.3.1</fileupload.version> <hutool.version>4.6.4</hutool.version> <zxing.version>3.4.0</zxing.version> <poi.version>4.1.0</poi.version> <log4j.version>1.2.17</log4j.version> <fastjson.version>1.2.56</fastjson.version> <validation.version>2.0.1.Final</validation.version> <hibernate.validator.version>6.0.17.Final</hibernate.validator.version> </properties>
<dependencies> <!-- jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <!-- javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency>
<!-- taglibs/standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>${standard.version}</version> </dependency> <!-- 导入spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
<!-- springmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency>
<!-- pagepelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <!-- mysql数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- json --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency>
<!-- 文件上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${fileupload.version}</version> </dependency>
<!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency>
<!-- hutool-all --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <!-- /poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency>
<!--core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>${zxing.version}</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>${zxing.version}</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <!--validation-api --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>${validation.version}</version> </dependency>
<!--hibernate-validator --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate.validator.version}</version> </dependency>
<!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency>
<!--el-api --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>el-api</artifactId> <version>6.0.29</version> </dependency> </dependencies> <build> <finalName>0520carrent</finalName>
<plugins> <!-- 配置tomcat的运行插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 配置端口 --> <port>8080</port> <!-- 配置urlencoding --> <uriEncoding>UTF-8</uriEncoding> <!-- 配置项目的访问路径 --> <path>/bjsxt</path> </configuration> </plugin>
<!-- 配置jdk的编译版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <!-- 指定source和target的版本 --> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project> |
配置tomcat运行插件
Copy代码和静态资源
配置web.xml
先使用外部的tomcat运行
08【掌握】maven项目的自动部署
相关命令的说明
Maven clean 清空之前生成的jar或者war 清空target目录下的内容
Maven install 打包生成的jar或war包
1,配置tomcat的账户conf/tomcat-users.xml
<role rolename="admin-gui"/> <role rolename="admin-script"/> <role rolename="manager-gui"/> <role rolename="manager-script"/> <user username="admin" password="admin" roles="admin-gui,admin-script,manager-gui,manager-script" /> |
重启tomcat登陆管理页面
2,配置maven的settings.xml
<server> <id>tomcat7</id> <username>admin</username> <password>admin</password> </server> |
3,修改pom.xml的配置
4,使用eclipse启动部署
5,使用maven命令
6,注意点
以上的操作:tomcat状态必须是启动状堂雷哥文档
https://files.cnblogs.com/files/chaojibaidu/%E5%B0%9A%E5%AD%A6%E5%A0%82maven%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3%E7%BB%93%E6%9E%84%E6%B8%85%E6%99%B0.zip
mavn学习补充参见:http://c.biancheng.net/view/4890.html
https://www.cnblogs.com/fanggege/p/12346265.html 有形象的图形来解释镜像与远程仓库的区别
https://www.cnblogs.com/java-linux/p/10263568.html 作为上面的补充