Java开发——Maven

MVC模式

MVC模式是软件工程中常见的一种软件架构模式,该模式把项目分为三个基本部分:模型Model、视图View和控制器Controller。
视图:界面的显示,以及与用户的交互功能
控制器:用来决定对于视图发来的请求需要那一个模型来处理,以及处理后需要跳回到哪一个视图,用来连接视图和模型
模型:持有所有的数据、状态和程序逻辑。模型接受视图数据的请求并返回最终的处理结果。


三层架构:三层是指表示层、业务逻辑层、数据访问层。三层中使用的数据时通过实体类(封装数据的JavaBean)来传递的。
三层架构.png

  1. 数据访问层:Data Access Layer DAL,用于对数据的处理,该层的方法一般都是原子性的,比如数据的增删改查。一般写在dao包中。
  2. 业务逻辑层:Business Logic Layer,用于对业务逻辑的封装,比如带逻辑的增删改查等。对于DAL而言,它是调用者,对于USL而言,它是被调用者。一般写在service包(或biz包)中
  3. 表示层: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。
依赖管理和项目构建
Pasted image 20230610140957.png
在网址mvnrepository.com中可以找到在maven中央仓库存储的各种资源的坐标。坐标用于描述仓库中资源的位置,通过唯一标识,可以将资源的识别与下载工作交由机器完成。

  • 依赖传递:一个项目使用了另一个项目,那么另一个项目里的所有依赖对这个项目来说都可用。而这样的依赖对这个项目来说称为间接依赖。
  • 直接依赖:项目通过配置文件直接写的依赖称为直接依赖。
  • 可选依赖:指对外隐藏当前项目所依赖的资源。在<dependency><\dependency>中加入<optional>true<\optional>
  • 排除依赖:本项目主动断开依赖项目的某些资源,被排除的资源无需指定版本。
    <dependency>依赖项目<\dependency>中加入
<exclusion>
	<groupId>something<\groupId>
	<artifactId>something<\artifactId>
<\exclusion>

当依赖传递中出现冲突,即直接依赖与间接依赖相同内容不同版本时,血缘关系越浅,层级越深,优先级越低。当资源在相同层级时,按照配置顺序的先后,靠前的覆盖靠后的。当直接依赖配置了相同资源的不同版本,后配置的覆盖前配置的。

依赖范围:依赖的jar默认情况可以在任何地方使用,如果改变属性需要通过scope标签设定其作用范围。
Pasted image 20230610134542.png
依赖范围的间接传递:(了解即可)
Pasted image 20230610135037.png

maven配置

一般情况下,本地仓库位置在C:\Users\用户名\.m2\repository目录下,所以需要自定义配置本地仓库的位置。

  1. 将Maven的bin目录加入环境变量Path中。
  2. 配置maven本地仓库:在maven安装目录下的conf\settings.xml中的<localRepository>标签中加入自己自定义的路径。
    Pasted image 20230610103040.png
  3. 配置镜像仓库:maven中心仓库服务器在国外,需要在settings.xml中配置阿里云的镜像仓库。找到<mirrors>标签,其中加入镜像仓库地址。
    Pasted image 20230610123553.png
    全局setting定义了当前计算机中maven的公共配置。
    用户setting定义了当前用户的配置,位置在E:\Java\maven\repository下,且用户setting要在全局setting的基础上修改,否则用户setting会覆盖全局setting。

手工生成

按照如下maven目录结构创建目录,进行代码编写:
Pasted image 20230610123317.png
编写完成后,在cmd中打开scr目录。
使用命令mvn compile编译main目录下的源文件,build success成功后生成target目录。
使用命令mvn clean,将target目录删除。
使用命令mvn test,下载对应插件,编译test目录下的源文件并进行测试,然后在target目录下生成surefire-reports测试报告。
target目录如下:
Pasted image 20230610123004.png
其中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
Pasted image 20230610124151.png

IDEA创建maven工程

在file的setting中查找maven,然后修改如图所示地方。
Pasted image 20230610130340.png
然后创建maven工程,可以选择模板。
Pasted image 20230610130739.png
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阶段:核心工作,比如编译、测试、打包、部署等
Pasted image 20230610135830.png
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高级使用

分模块开发与设计

Pasted image 20230610154057.png
将之前每一个包都变为一个模块,便于解耦!不同模块之间的开发互不干扰,同时结构更明了。

当编译一个工程时,需要保证依赖的项目都在本地仓库中,尤其是自定义的工程,必须先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>

Pasted image 20230610163440.png

继承与聚合:
作用:聚合用于快速构建项目,继承用于快速配置
相同:聚合与继承的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>

多环境兼容

  1. 定义多环境
<!--创建多环境-->
<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>
  1. 加载指定环境:mvn 指令 -P 环境id

三种跳过测试

命令:mvn 指令 -D skipTests
界面操作跳过:
Pasted image 20230610171129.png
配置跳过测试: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

posted @ 2023-06-11 14:42  梅落南山  阅读(45)  评论(0编辑  收藏  举报