Java开发——Maven
MVC模式
MVC模式是软件工程中常见的一种软件架构模式,该模式把项目分为三个基本部分:模型Model、视图View和控制器Controller。
视图:界面的显示,以及与用户的交互功能
控制器:用来决定对于视图发来的请求需要那一个模型来处理,以及处理后需要跳回到哪一个视图,用来连接视图和模型
模型:持有所有的数据、状态和程序逻辑。模型接受视图数据的请求并返回最终的处理结果。
三层架构:三层是指表示层、业务逻辑层、数据访问层。三层中使用的数据时通过实体类(封装数据的JavaBean)来传递的。
- 数据访问层:Data Access Layer DAL,用于对数据的处理,该层的方法一般都是原子性的,比如数据的增删改查。一般写在dao包中。
- 业务逻辑层:Business Logic Layer,用于对业务逻辑的封装,比如带逻辑的增删改查等。对于DAL而言,它是调用者,对于USL而言,它是被调用者。一般写在service包(或biz包)中
- 表示层:User Show Layer USL,用于现实数据和接收用户输入的数据,为用户提供一种交互式操作的界面。USL前台代码指用户能直接访问到的界面,一般是程序的外观,写在webcontent目录下。USL后台代码是用来调用BLL的代码,一般写在servlet包中。
MVC模式和三层架构,分别从两个不同的角度设计的,但目的都是解耦、分层、代码复用等。
SSM框架
SSM框架是spring、spring MVC和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层:dao层、service层、controller层和view层。使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎。
dao层:主要做数据持久层的工作。负责与数据库进行联络的一些任务封装于此。先设计接口然后在spring的配置文件中定义接口的实现类。然后在模块中进行接口的调用实现数据业务的处理。
service层:主要负责业务模块的逻辑应用设计。先设计接口再设计类,然后在spring的配置文件中配置其实现的关联,具体要调用到自己已经定义好的Dao接口。每个模型都有一个service接口,每个接口分别封装各自的业务处理的方法。
controller层:负责具体的业务模块流程的控制。调用service层提供的接口来控制业务流程。配置也同样是在Spring的配置文件里进行。
view层:主要和controller层紧密结合,主要负责前台jsp页面的表示。
Maven
参考黑马程序员B站课程Maven
一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型Poject Object Model POM。
依赖管理和项目构建
在网址mvnrepository.com中可以找到在maven中央仓库存储的各种资源的坐标。坐标用于描述仓库中资源的位置,通过唯一标识,可以将资源的识别与下载工作交由机器完成。
- 依赖传递:一个项目使用了另一个项目,那么另一个项目里的所有依赖对这个项目来说都可用。而这样的依赖对这个项目来说称为间接依赖。
- 直接依赖:项目通过配置文件直接写的依赖称为直接依赖。
- 可选依赖:指对外隐藏当前项目所依赖的资源。在
<dependency><\dependency>
中加入<optional>true<\optional>
- 排除依赖:本项目主动断开依赖项目的某些资源,被排除的资源无需指定版本。
在<dependency>依赖项目<\dependency>
中加入
<exclusion>
<groupId>something<\groupId>
<artifactId>something<\artifactId>
<\exclusion>
当依赖传递中出现冲突,即直接依赖与间接依赖相同内容不同版本时,血缘关系越浅,层级越深,优先级越低。当资源在相同层级时,按照配置顺序的先后,靠前的覆盖靠后的。当直接依赖配置了相同资源的不同版本,后配置的覆盖前配置的。
依赖范围:依赖的jar默认情况可以在任何地方使用,如果改变属性需要通过scope标签设定其作用范围。
依赖范围的间接传递:(了解即可)
maven配置
一般情况下,本地仓库位置在C:\Users\用户名\.m2\repository目录下,所以需要自定义配置本地仓库的位置。
- 将Maven的bin目录加入环境变量Path中。
- 配置maven本地仓库:在maven安装目录下的conf\settings.xml中的<localRepository>标签中加入自己自定义的路径。
- 配置镜像仓库:maven中心仓库服务器在国外,需要在settings.xml中配置阿里云的镜像仓库。找到<mirrors>标签,其中加入镜像仓库地址。
全局setting定义了当前计算机中maven的公共配置。
用户setting定义了当前用户的配置,位置在E:\Java\maven\repository下,且用户setting要在全局setting的基础上修改,否则用户setting会覆盖全局setting。
手工生成
按照如下maven目录结构创建目录,进行代码编写:
编写完成后,在cmd中打开scr目录。
使用命令mvn compile
编译main目录下的源文件,build success成功后生成target目录。
使用命令mvn clean
,将target目录删除。
使用命令mvn test
,下载对应插件,编译test目录下的源文件并进行测试,然后在target目录下生成surefire-reports测试报告。
target目录如下:
其中classes是源文件生成的字节码,test-classes是test文件生成的字节码。
使用命令mvn package
,对项目进行打包,生成打包文件.jar。
使用命令mvn install
,将打包的.jar放入E:\Java\maven\repository文件下,即安装到本地仓库,这样别的项目就可以依赖本项目。
插件创建工程
在一个不包含pom.xml的目录下,使用cmd命令创建一个模板工程。
mvn archetype:generate-DgroupId={project-packaging}-DartifactId={project-name}-DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=false
IDEA创建maven工程
在file的setting中查找maven,然后修改如图所示地方。
然后创建maven工程,可以选择模板。
org.apache.maven.archetypes:maven-archetype-quickstart快速创建一个Java工程,org.apache.maven.archetypes:maven-archetype-webapp则是快速创建一个web工程。
在最右侧的maven中的lifecycle中有各种运行指令,点击即可运行。
对于web工程的pom.xml中需要加入tomcat插件,等待安装好后,在最右侧maven中的项目下的plugins找到tomcat7插件中的tomcat7:run,即可启动一个服务器。
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
生命周期与插件
生命周期可划分为三部分:
clean阶段:清理工作
default阶段:核心工作,比如编译、测试、打包、部署等
site阶段:产生报告,发布站点等
插件:插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能。默认maven在各个生命周期上绑有预设的功能,但是可以通过插件自定义其他功能。
<build>
<plugins>
<plugin>
<!--插件坐标-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<!--表示执行-->
<executions>
<execution>
<goals>
<!--执行哪个功能,每一个插件都在官网上有解释-->
<goal>jar</goal>
</goals>
<!--生命周期的名字-->
<phase> generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
maven高级使用
分模块开发与设计
将之前每一个包都变为一个模块,便于解耦!不同模块之间的开发互不干扰,同时结构更明了。
当编译一个工程时,需要保证依赖的项目都在本地仓库中,尤其是自定义的工程,必须先install到本地仓库中才能使用。
多模块构建维护
聚合
用于快速构建maven工程。
创建一个空模块作为父工程,打包类型定义为pom,<packaging>pom<\packaging>
。定义当前模块进行构建操作时关联的其他模块名称。
<modules>
<module>../ssm_controller</module><!--相对位置所以是../开头-->
<module>../ssm_service</module>
<module>../ssm_dao</module>
<module>../ssm_pojo</module>
</modules>
该工程只提供pom.xml文件,为了管理各种工程。使用modules标签加载各种工程。注意,参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。
继承
通过继承可以实现在子工程中沿用父工程中的配置,与Java继承相似。当然除了依赖关系,插件也同理。
在父工程中定义依赖管理,父工程改变version,则子工程统一也改变version。
<!--依赖管理-->
<dependencyManagement>
<!--具体依赖-->
<dependencies>
<!--spring环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependencies>
<dependencyManagement>
在子工程中需要声明其父工程坐标与对应位置,同时使用父工程定义的依赖关系时,无需声明依赖版本,版本参照父工程中依赖的版本。
<!--定义该工程的父工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!--父工程的pom相对路径-->
<relativePath>../ssm/pom.xml</relativePath>
</parent>
<!--定义该工程的依赖关系-->
<dependencies>
<!--spring环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
继承与聚合:
作用:聚合用于快速构建项目,继承用于快速配置
相同:聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到一个pom文件中。它们均属于设计型模块,并无实际的模块内容。
不同:聚合可以感知到参与聚合的模块有哪些。继承父模块无法感知到哪些子模块继承了自己。
属性
类似于变量,通过统一配置相关属性,更便于统一修改。
- 自定义属性
<!--定义自定义属性-->
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
<!--调用格式-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version><!--大括号内是我们定义的标签-->
</dependency>
- 内置属性:使用maven内置属性,快速配置。比如
${version}
- Setting属性:使用maven配置文件setting.xml中的标签属性,用于动态配置。
${settings.localRepository}
- Java系统属性:读取Java系统属性。
${user.home}
系统属性查询:
mvn help:system
- 环境变量属性
版本管理
- SNAPSHOT:快照版本。项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时间更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫做快照版本(测试阶段版本)
- RELEASE:发布版本。详谬开发进入阶段里程碑后,向团队外部发布较为稳定的版本。
工程版本号约定规范:<主版本>.<次版本>.<增量版本>.<里程碑版本>
主版本:项目重大架构的变更
次版本:有较大的功能增加和变化,或全面系统地修复漏洞
增量版本:有重大漏洞的修复
里程碑版本:相对来说不是很稳定,有待更多的测试。
资源配置
资源配置多文件维护,在父工程的pom文件中配置文件引用pom属性,可在任意配置文件中加载pom文件中定义的属性,调用格式为${自定义标签名称}
。
如果不进行开启,则在install后jar里面的代码不会自动解析自定义的属性。开启配置文件加载pom属性的代码为:
<resources>
<resource>
<!--设定配置文件对应的位置目录,支持使用属性动态设定路径-->
<directory>${project.basedir}/src/main/resources</directory>
<!--开启对配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<!--设定配置文件对应的位置目录,支持使用属性动态设定路径-->
<directory>${project.basedir}/src/test/resources</directory>
<!--开启对配置文件的资源加载过滤-->
<filtering>true</filtering>
</testResource>
</testResources>
多环境兼容
- 定义多环境
<!--创建多环境-->
<profiles>
<!--定义具体环境:生产环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>pro_env</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<!--设置默认启动-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定义具体环境-->
<profile>
<id>dev_env</id>
......
</profile>
</profiles>
- 加载指定环境:
mvn 指令 -P 环境id
三种跳过测试
命令:mvn 指令 -D skipTests
界面操作跳过:
配置跳过测试:maven-surefire-plugin插件负责测试工作。
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests><!--设置跳过用例-->
<includes> <!--包含指定的测试用例-->
<include>**/User*Test.java</include>
</includes>
<excludes><!--排除指定的测试用例-->
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>
私服
本地仓库与中央仓库的缓冲。
Nexus:是Sonatype公司的一款私服产品,下载地址
启动服务器:nexus.exe /run nexus
访问服务器:http://localhost:8801(默认端口8801)
私服有三种仓库。
- 宿主仓库hosted:保存无法从中央仓库获取的资源(自主研发或第三方非开源项目)
- 代理仓库proxy:代理远程仓库,通过nexus访问其他公共仓库,比如中央仓库
- 仓库组group:将若干个仓库组成一个群组,简化配置,仓库组不能保存资源,属于设计型仓库
资源上传至私服。
本地仓库访问私服:配置本地仓库访问私服的权限,在setting.xml文件中配置
<servers>
<server>
<id>heima-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>heima-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus-heima</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
配置当前项目访问私服上传资源的保存位置,pom.xml文件中
<distributionManagement>
<repository>
<id>heima-release</id>
<url>http://localhost:8081/repository/heima-release/</url>
</repository>
<snapshotRepository>
<id>heima-snapshots</id>
<url>http://localhost:8081/repository/heima-snapshots/</url>
</snapshotRepository>
</distributionManagement>
发布资源到私服命令mvn deploy