Maven教程之春

1.简介

在本文中,我们将演示如何针对非常特定的用例对Spring使用Maven依赖项。 我们使用的所有库的最新版本都可以在Maven Central上找到。

对于一个有效的构建周期而言,了解Maven依赖项的工作方式以及如何对其进行管理非常重要,并且对于在我们的项目中使用的各种库之间有关哪些版本匹配的清晰概念也很重要。 这是由于我们经常在多个项目中重复一组依赖项的原因。 当我们不明白为什么要使用特定的库版本时,我们应该犯错误。 让我们了解不同的Spring Framework依赖关系之间的关系。

2.项目设置

我们将使用许多Maven原型之一为我们的示例创建一个示例项目。 要创建项目,请在将用作工作空间的目录中执行以下命令:

创建样本项目

mvn archetype:generate -DgroupId=com.javacodegeeks.example -DartifactId=JCG-SpringMaven-Example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果您是第一次运行maven,则完成生成命令将花费几秒钟,因为maven必须下载所有必需的插件和工件才能完成生成任务。

Spring Maven项目设置

请注意,现在,您将在所选目录中拥有一个与artifactId同名的新目录。 现在,随时在您喜欢的IDE中打开项目。 另外, 仅当我们添加适当的Spring依赖项时,才需要该项目来演示各种依赖项树

最后,我们使用一个简单的maven命令来代替使用IDE来创建该项目。 这有助于我们使项目设置和初始化不受您可能使用的任何特定IDE的影响。

3. Maven的Spring依赖

由于Spring Framework具有高度模块化的性质,因此添加一个依赖关系不会对另一个依赖关系产生要求。 例如,Spring Context依赖不需要任何Spring MVC依赖或Spring数据库。 因此,我们将在各自独立的部分中介绍每个依赖项。

要添加Spring Context支持,这里是需要的依赖项:

Spring语境

<properties><org.springframework.version>5.0.4.RELEASE</org.springframework.version>
</properties>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework.version}</version><scope>runtime</scope>
</dependency>

请注意,我们使用了发布此文章时发布的最新可用Spring版本。 同样,可以在Maven Central上找到我们使用的所有库的最新版本。

要了解添加特定依赖项时添加到项目中的所有依赖项,我们可以运行一个简单的Maven命令,该命令使我们能够查看项目的完整依赖项树。 这是我们可以用来实现的Maven命令:

检查依赖树

mvn dependency:tree

当我们运行此命令时,它将向我们显示以下依赖关系树:

Spring上下文依赖树

spring-context将实际的Spring Injection Container引入了项目,并需要更多的JAR,例如spring-aopspring-beansspring-corespring-expressionspring-jcl 。 当我们运行上面的命令时,在向我们展示依赖树之前,maven首先再次下载了JAR,以确认是否已更改。

请注意,如果其中一个依赖项需要另一个依赖项才能运行,它也会被下载,并在上面的依赖关系树中显示为该树的子分支。 当某个依赖项将另一个依赖项带入构建系统的依赖项池中时,将清除间接依赖项的子分支表示方法。

最后,我们在此处添加的spring-context依赖项是runtime范围 。 这是因为仅在运行时才需要此JAR,以仅提供与Spring相关的类,并且不直接在项目中使用,至少不用于简单项目。

4. Spring Persistence Maven依赖关系

现在,让我们看一下Spring Persistence实现所需的核心依赖项:

Spring持久性

<dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${org.springframework.version}</version>
</dependency>

当我们查看此库的依赖关系树时,我们会发现JDBC和Transaction支持也包含在此依赖关系中:

Spring持久性依赖树

5. Spring MVC Maven依赖关系

Spring MVC Maven依赖关系是您开始使用Spring处理Web项目时将使用的主要依赖关系。 这是在项目中设置Spring MVC的maven依赖项:

SpringMVC

<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${org.springframework.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework.version}</version>
</dependency>

这是Spring Framework Maven依赖项家族中最常用的依赖项之一。 现在让我们看一下spring-webspring-webmvc库的依赖关系树:

Spring MVC依赖树

spring-web库包含Servlet Environment的最常用的Web实用程序。 第二个库spring-webmvc为Servlet环境提供了MVC支持

6.通过Maven提供测试支持

测试始终是项目不可或缺的一部分。 在Spring中,我们对库也有依赖性,我们也可以测试我们的应用程序。 其依赖项定义为:

弹簧测试

<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${org.springframework.version}</version>
</dependency>

让我们看一下所有库及其依赖树所包含的内容:

Spring测试依赖树

即使这就是我们现在需要的所有测试依赖项,我们也会在这里查看Spring Framework中使用的两个最常用的测试库JUnit和Mockito 。

7. Spring Security Maven依赖关系

在Spring Security with Maven课程中详细讨论了与Spring Security支持相关的Maven依赖关系。

8.在Maven中使用JUnit

要在基于Spring的项目中添加JUnit依赖项,只需添加一个具有test范围的简单依赖项:

JUnit的

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

让我们看一下所有库及其依赖树所包含的内容:

JUnit依赖树

JUnit也带来了Hamcrest库。 要在JUnit中使用Hamcrest匹配器,我们使用assertThat语句后跟一个或多个匹配器。 要了解Hamcrest中可用的匹配器,请阅读Hamcrest匹配器教程 。

9.在Maven中使用Mockito

Mockito是使用最广泛的Java测试依赖项之一,它还可用于模拟对象及其行为:

莫基托

<dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.10.19</version><scope>test</scope>
</dependency>

让我们看一下所有库及其依赖树所包含的内容:

Mockito依赖树

10.项目:Hello World

正如对Spring MVC的简单演示一样,我们将展示如何使用Spring MVC 5制作一个简单的控制器。为此,我们使用了在Spring MVC部分中提到的依赖项以及一些Servlet容器依赖项。 这是我们在项目中使用的所有依赖项的列表:

pom.xml

<dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${org.springframework.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework.version}</version>
</dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope>
</dependency>
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version>
</dependency>

要在项目中配置前端Controller,我们将对AbstractAnnotationConfigDispatcherServletInitializer类进行子类化:

AppConfig.java

package com.javacodegeeks.example.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class AppConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[] { RootConfig.class };}protected Class<?>[] getServletConfigClasses() {return new Class[] { WebMvcConfig.class };}protected String[] getServletMappings() {return new String[] { "/" };}
}

现在,我们需要创建一个Root配置类,该类将是空的,因为我们目前尚未在项目中配置任何bean:

RootConfig.java

package com.javacodegeeks.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = { "com.javacodegeeks.example.*" })
public class RootConfig {
}

为了使该项目成为MVC项目,我们需要制作一个WebMvcConfigurer类,该类也使用@EnableWebMvc注释对其进行标记。 这将启用项目的MVC性质:

WebMvcConfig.java

package com.javacodegeeks.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.javacodegeeks.example.*" })
public class WebMvcConfig implements WebMvcConfigurer {
}

准备好项目的配置后,我们现在可以添加Controller作为最后一步。 为了演示,我们将制作一个简单的GET API,该API仅将String返回为“ Hello World”:

HomeController.java

package com.javacodegeeks.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HomeController {@GetMapping("/hello")@ResponseBodypublic String helloWorld() {return "Hello World";}
}

当我们运行该项目时,我们将在浏览器中看到一条简单的消息。 打开我们配置的URL,它是:

网址

localhost:8080/hello

我们将看到以下输出:

SpringMVC Hello World

有关为何需要配置类的详细说明,请阅读Spring MVC Tutorial 。

11.结论

在这篇文章中,我们讨论了与Spring框架相关的各种Maven依赖关系,这使每个依赖关系的模块化以及它们如何相互独立的事情一目了然。 本课是了解所需依赖项的绝佳起点。 我们还研究了Spring Framework依赖关系的几个部分,以及JUNit和Mockito的依赖关系,即使它们不是Spring Framework本身的一部分,但经常与基于Spring的项目一起使用,以为Spring Framework的各个层提供广泛的测试支持。

最后,我们学习了如何使用简单的maven命令显示项目的依赖关系树,并观察项目的哪些依赖关系还取决于其他哪些依赖关系。

在此处阅读有关Spring Framework的更多课程。

12.下载源代码

本课说明了如何使用Spring框架的Maven依赖关系,以及如何通过将依赖关系保持独立和模块化来呈现特定的用例。

下载
您可以在此处下载此示例的完整源代码: JCG-SpringMaven-Example

翻译自: https://www.javacodegeeks.com/2018/04/spring-with-maven-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java微妙_编码Java时的10个微妙的最佳实践

java微妙这是10条最佳实践的列表&#xff0c;这些最佳实践比您的平均Josh Bloch有效Java规则要微妙得多。 尽管Josh Bloch的列表很容易学习&#xff0c;并且涉及日常情况&#xff0c;但此处的列表包含了涉及API / SPI设计的较不常见的情况&#xff0c;尽管这些情况可能会产生很…

GraphQL在Wildfly群上

“ GraphQL是API的查询语言&#xff0c;是用于使用现有数据完成这些查询的运行时。 GraphQL为您的API中的数据提供了一个完整且易于理解的描述&#xff0c;使客户能够准确地询问他们所需的内容&#xff0c;仅此而已&#xff0c;使随着时间的推移更容易开发API并启用强大的开发人…

javafx 示例_示例介绍:JavaFX 8打印

javafx 示例我有一段时间没有写博客了&#xff0c;我想与其他人分享有关JavaFX的所有信息&#xff08;我的日常工作和家庭可能是借口&#xff09;。 对于那些对此博客不熟悉的人 &#xff0c;我是JavaFX 2 Introduction by Example&#xff08;JIBE&#xff09;的作者&#xff…

Spring Data JPA教程

在Java类或对象与关系数据库之间管理数据是一项非常繁琐且棘手的任务。 DAO层通常包含许多样板代码&#xff0c;应简化这些样板代码&#xff0c;以减少代码行数并使代码可重复使用。 在本教程中&#xff0c;我们将讨论Spring数据的JPA实现。 1.简介 1.1什么是JPA&#xff1f;…

使用storm 实时计算_使用Storm进行可扩展的实时状态更新

使用storm 实时计算在本文中&#xff0c;我将说明如何借助Storm框架以可扩展且无锁定的方式在数据库中维护实时事件驱动流程的当前状态。 Storm是基于事件的数据处理引擎。 它的模型依赖于基本原语&#xff0c;例如事件转换&#xff0c;过滤&#xff0c;聚合……&#xff0c;我…

【多元域乘法】多项式乘法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、sub_gf_…

my CSAPP Attack lab堆栈详解

关注公号【逆向通信猿】更精彩!!! 这个实验时学习了简书上的一篇文章后,自己根据课程例子进行的一次小测试,phase 4和5的堆栈图解还没有画,等后续有时间会进行补充。 本人转载的简书原文: https://blog.csdn.net/wlwdecs_dn/article/details/121249364#comments_19237…

Spring MVC教程

1.简介 作为企业Java开发人员&#xff0c;这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序&#xff0c;后果还包括许多挑战。 具体来说&#xff0c;其中一些是状态管理&#xff0c;工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spring的Web框架旨…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

Spring Reactor教程

在RESTful服务的世界中&#xff0c;实际上实际上是在幕后进行许多工作&#xff0c;我们通常必须在应用程序中进行很多处理&#xff0c;而实际上并不会影响需要发送给真实用户的响应。 可以被动地做出这些业务决策&#xff0c;以便它们对与应用程序交互的用户没有任何影响。 Spr…

api签名_使用签名保护基于HTTP的API

api签名我在EMC上的一个平台上可以构建SaaS解决方案。 与越来越多的其他应用程序一样&#xff0c;该平台具有基于RESTful HTTP的API。 使用JAX-RS之类的开发框架&#xff0c;构建这样的API相对容易。 但是&#xff0c; 正确构建它们并不容易。 建立基于HTTP的API的问题 问…

【多元域除法】多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的加法和乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、s…

win10高分辨率下修改字体显示大小(不是缩放百分比)

问题 不通过修改设置缩放百分比来增大win10的字体显示大小&#xff0c;缩放百分比调大后会导致很多问题出现&#xff01;&#xff01;&#xff01; 修改 打开设置&#xff0c;或者右键个性化&#xff0c;在搜索栏输入&#xff1a;“放大文本大小”&#xff0c;搜索框下面会自…

应用程序无法正常启动 0xc0150002

Visual Studio 2017在debug下运行程序报错 应用程序无法正常启动 0xc0150002 分析原因 可能是&#xff1a;原程序是低版本的VS所编写的&#xff0c;缺少低版本的运行库&#xff0c;所以报错 解决 安装了VS2010后即可正常运行 error LNK2019: 无法解析的外部符号 __vsnwprin…

Excel之抽奖器实现

Excel实现一个抽奖器&#xff0c;关键在于学会几个Excel中的函数即可轻松实现。 单人抽奖 RANDBETWEEN 例&#xff1a; INDEX(A2:A61,RANDBETWEEN(1,60))缺点&#xff1a;这种方式生成的抽奖器&#xff0c;在多人情况下&#xff0c;由于RANDBETWEEN函数的返回值有可能是相同…

【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 【多元域乘法】多项式乘法电路原理及MATLAB详解 【多元域除法】多项式除法电路原理及MATLAB详解 RS码编码原理 RS码的编码与BCH码类似,区别在于RS码为多进制的 生成多项式…

如何用Java编写类似C的Sizeof函数

如果您刚开始学习Java并且是C语言背景&#xff0c;那么您可能已经注意到Java和C编程语言之间存在一些差异&#xff0c;例如String是Java中的对象&#xff0c;而不是NULL终止的字符数组。 同样&#xff0c;Java中没有sizeof&#xff08;&#xff09;运算符。 所有原始值都有预定…

Spring启动教程

1.简介 如果您一直想使用一个Web框架&#xff0c;它使您能够快速开始API开发&#xff0c;而无须设置Web服务器&#xff0c;收集所有有线依赖项&#xff0c;安装各种工具的麻烦&#xff0c;那么您将拥有一个出色的框架&#xff0c;即Spring开机 Spring Boot的主要座右铭是约定优…

【LDPC系列1】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真

关注公号【逆向通信猿】更精彩!!! 1. 构造编码器对象 采用MATLAB内置的comm.LDPCEncoder构造编码器对象,其中使用默认的校验矩阵,信息位长32400比特,码长64800比特,该校验矩阵中除第一行中1的个数为6个外,其余行中1的个数均为7;前12960列中1的个数为8,后32400列构成…

【LDPC系列2】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真(IEEE 802.16e标准协议基础矩阵)

关注公号【逆向通信猿】更精彩!!! 1. 构造校验矩阵H,并保存为mat文件 采用IEEE 802.16e标准协议中的基础校验矩阵 通过构造QC-LDPC校验矩阵,码长n=2304,信息长k=1152,码率r=1/2,基础矩阵维数为1224: Hb = [-1 94 73 -1