Maven
Struts Spring MyBatis
做一个项目,首先需要各个jar包的下载,先到Struts 2官网下载Struts 2 jar包,在到Spring官网下载Spring jar包,还有MyBatis jar包,以及第三方的jar包。在项目还没有开始的时候就已经有了很多的jar包,有用的,没用的,版本冲突的,所以在这个时候出现了优秀的开源的项目管理。
Maven, Ant, gradle优秀的项目管理
Maven快速入门————介绍及环境搭建
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。
登录官网https://maven.apache.org/,下载maven.bin的压缩文件,下载后解压打开。打开apache-maven-3.5.4下的bin文件夹,里面有可以运行的mvn脚本,boot目录包含了一个类加载器的框架,conf下是配置文件的目录,lib下有所有的类库。接下来配置环境变量。
右键我的电脑,属性,选择“高级系统设置”,点击环境变量。在“系统变量”中新创建一个,名为“M3_HOME”,变量值为apache-maven-3.5.4的路径。点击Path,编辑“%M3_HOME%\bin”。点击确定。打开终端,输入“mvn -v”,即可查看电脑所有的信息,配置成功的话就可以看到maven的版本信息。
目录结构
常用的构建命令介绍:
mvn -v 查看maven版本
compile 编译
test 测试
package 打包项目
clean 删除target
install 安装jar包到我们的目录
自动创建目录骨架:
archetype插件:用于创建符合maven规定的目录骨架
maven规定:
src
-main
-java
-主代码(com.sycu.项目名.作者.包名)
src
-test
-测试代码(用来进行测试)
创建目录的两种方式:
1、archetype:generate 按照提示进行选择
2、archetype:generate -DgroupId=组织名,公司网址反写+项目名
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage=代码所存在的包名
maven中的坐标和仓库
坐标 构建
所有的构建均通过坐标作为其唯一标识
其中groupId、artifactId、version都是组成项目基本的坐标
仓库:用来管理依赖,分成 本地仓库 和 远程仓库 两种
maven为我们提供了一个超级pom,在lib下maven-model-builder.XXX.jar中,这里面的pom-XXX.XML,是所有的pom都会继承这个pom
maven全球中央仓库的地址 url:https://repo.maven.apache.org/maven2
镜像仓库:maven/conf/settings.xml
第152行可以看到有mirror
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>//这里可以指定仓库名,也可以使用通配符 * 来匹配所有的镜像,一旦配置镜像,所有针对原仓库的访问都会转到镜像仓库,那么原仓库就不能再继续访问
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
更改仓库位置:
maven从远程仓库下载 构建,默认是存放在当前的用户目录中 C:\Users\Administrator\.m2
最好是不要存放在C盘中,要是重做系统,那么这些数据就会消失
在别的盘下创建一个文件夹repo,然后打开conf下的settings.xml文件,
在53行出找到<localRepository>/path/to/local/repo</localRepository>,把他复制粘贴出来,修改成刚才repo的文件夹路径,同时把\替换成/,
例如:<localRepository>D:/mavenworkspace/repo</localRepository>
修改成功之后,把settings.xml文件复制到repo文件夹下,然后打开终端,进入到一个项目中,再次输入mvn clean compile,敲回车就OK了。
在Eclipse中安装maven插件以及创建maven项目
到网站上下载插件,m2e https://download.csdn.net/download/zk461759809/8817869
下载好后放在安装eclipse目录下的dropins目录下即可。
然后打开安装eclipse的文件夹,下面有一个eclipse.ini的文件,打开,在第11行下(也不一定),添加行输入:
-vm
C:\Java\jdkXXXXXXX(安装jdk的jdk下的bin文件夹路径)\javaw.exe
随后打开eclipse->windows->Preferences
点击Java->Installed JREs。 在这里要选择jdk的安装路径
点击Maven->Installations。 点击Add,选择maven的安装路径,勾选中,ok
点击Maven->UserSettings。 User Settings下选择repo下的settings.xml文件
随后创建一个maven项目,创建完成之后,打开pom.xml,可以发现跟我们之前写的是一样的。
接着在pom.xml文件上右键,Run As -> Maven build... 再Goals中写入compile就可以编译,在控制台上就可以看到有BUILD SUCCESS,这就完成搭建了。
如果出现错误:-Dmaven.multiModuleProjectDirectory system propery is not set. XXXXXXXXXXXXXXXXXXXXXX,
那么打开eclipse->windows->Preferences->Java->Installed JREs,点击jdk,edit,在Default VM arguments中写入:-Dmaven.multiModuleProjectDirectory=$M3_HOME(自己配置的环境变量的名)
Maven的生命周期和插件
之前使用过clean、compile、test、package、install
一个项目完整的构建过程包括:
清理、编译、测试、打包、集成测试、验证、部署
maven和插件密不可分:maven抽象出一套项目构建的生命周期。而插件是对抽象进行实现。
maven中定义了三套生命周期:1、clean 清理项目
2、default 构建项目
3、site 生成项目站点
这三套生命周期是相互独立的,每个生命周期都包含一些阶段,各个生命周期中的阶段都是有顺序的,且后面的阶段依赖于前面的阶段,执行某一个阶段时,其前面的阶段会顺序执行,但不会触发另外两套生命周期的任何阶段。
clean清理项目
pre-clean 执行清理前的工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件
default构建项目(最核心)
compile test package install(最为常用,不常用的还有很多)
site生成项目站点
pre-site 在生成项目站点前要完成的工作
site 生成项目的站点文档
post-site 在生成项目站点后要完成的工作
site-deploy 发布生成的站点到服务器上 使用source插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包的时候系统会自动的进行测试以及打包
pom.xml是项目的核心管理文件,用于描述、组织管理、依赖管理、构建信息的管理
pom.xml包含了很多的标签
!!!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">
<!-- 指定了当前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目标识,反写的公司网址+项目名 -->
<groupId>com.imooc.hi</groupId>
<!-- 项目名+模块名 -->
<artifactId>hi</artifactId>
<!-- 第一个0表示大版本号
第二个0表示分支版本号
第三个0表示小版本号
0.0.1
snapshot 快照
alpha 内部测试
beta 公测
Release 稳定
GA 正式发布 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 打包方式,默认是jar。
还有 war zip pom-->
<packaging>jar</packaging>
<!-- 项目描述 -->
<name>hi</name>
<!-- 项目地址 -->
<url>http://maven.apache.org</url>
<!--
项目描述
<description></description>
开发人员信息
<developers></developers>
许可证的信息
<licenses></licenses>
组织信息
<organization></organization>
-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖列表 -->
<dependencies>
<!-- 依赖项 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- 依赖范围
test是只有在test测试的范围内有用-->
<scope>test</scope>
<!-- 设置依赖是否可选
里面有true和false
默认是false
子项目如果默认是false,子项目默认是继承的
如果是true,子项目必须写入引用给依赖
<optional></optional>
排除依赖传递的列表
<exclusions>
<exclusion>
</exclusion>
</exclusions>
<
-->
</dependency>
</dependencies>
<!--
依赖的管理
<dependencyManagement>
<dependencies>
里面有很多的依赖类表,但是并不会被运行,不会被引入到实际的依赖中。
这个标签一般是被定义在父模块中的,供子模块所继承用的
</dependencies>
</dependencyManagement>
-->
<build>
<!-- 插件的列表,可以包含多个plugin -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 通常用于子模块在父模块中的pom的继承
<parent></parent> -->
<!-- 用来聚合多个的maven项,可以在module中指定多个模块进行编译
<modules>
<module>
</module>
</modules> -->
</project>
依赖范围
<scope>test</scope>
三种classpath:1、编译 2、测试 3、运行
6种scopes
1、compile:如果没有指定,那么就默认的范围,编译测试运行都有效
2、provided:在编译和测试时有效,在最后运行的时候不会被加入
3、runtime:在测试和运行时有效
4、test:只在测试范围内有效
5、system:在编译和测试时有效,因为与本地相关联,所以有很大的不可移植性
可能将项目移动到别的电脑上,会因为路径不一致,而导致错误
6、import:导入的范围,他只是用在dependencyManagement中,表示从其他的pom中导入dependency的配置
依赖的传递
在依赖列表中加入一个dependency
<dependencies>
<!-- 依赖项 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
添加上要依赖的标识
<groupId>com.imooc.XXX</groupId>
<artifactId>XXX-XXX</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
排除依赖
如果C依赖于B,B依赖于A,那么C就间接性的依赖于A
但是现在不想让C依赖于A,那么就需要排除依赖
在dependency依赖项中加入exclusions
<dependencies>
<!-- 依赖项 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
添加上要依赖的标识
<groupId>com.imooc.XXX</groupId>
<artifactId>XXX-XXX</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.imooc.A</groupId>
<artifactId>XXX-A</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
这样就不会依赖于A了
另:想要每新建的项目JRE都是固定的版本号,那么比较简单的方法就是打开maven安装路径下的settings文件,在182行左右,可以看到有profiles,然后输入一段代码:
<profile>
<id>jdk-1.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>
这样在新建项目的时候就会都变成1.8
依赖冲突:有A和B依赖了一个不同版本的相同构建,对于依赖A B 和 C来说,他究竟依赖的是A和B的哪一种构建?
用来搜索新的依赖下载
https://www.mvnrepository.com
这里有两条原则:1、短路优先(它会优先解析这个路径短的版本)
例子:A->B->C->X(jar)
A->D->X(jar) √
那么它会优先解析下面路径短的版本
2、先声明先优先(如果路径长度相同,则谁先声明,先解析谁)
聚合和继承
聚合是将多个项目整合在一起进行,比如install,避免了分开式的操作,那么在pom.xml中写入: |
<modules>
<module>../hongxing-bg</module>
<module>../hongxing-ng</module>
<module>../hongxing-sj</module>
</modules>
继承
要使用继承需要有一个父类的项目,在这个项目中是不需要有main和test的,所以可以将其删除掉,打开pom,在依赖项的外层加一个dependencyManagement,这样就可以被继承了。
其中dependency下的version可以放在properties下
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
然后在dependency下的version中修改成<version>${junit.version}</version>
最终是以下代码:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
随后在子类中dependency下的version和scope去掉,在上面加入parent的标签,parent下是继承的坐标粘贴过来:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
最终子类的代码就是:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
使用maven构建web项目
在最开始创建的web项目中,index.jsp是错误的,因为没有Servlet API的缘故,现在在网站中(https://www.mvnrepository.com)搜索servlet。
启动服务有两种形式:1、jetty 2、Tomcat
1、在https://www.mvnrepository.com中搜索jetty maven plugin字样进行搜索,然后选取版本号进行粘贴
好用的内容如下:
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
在启动服务的时候输入:jetty:run,同时也可以在打包的时候启动服务,那么需要在build下添加plugins、plugin、executions、execution标签。代码为:
<plugins>
<plugin>
<!-- jetty服务进行启动 <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version> -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<!-- 在打包成功后使用jetty:run来运行jetty服务 -->
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
添加好之后就可以输入clean package进行打包并启动服务了。
2、在https://tomcat.apache.org中,左侧有一个Maven Plugin,点击进去选择一个版本粘贴,内容如下:
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>