1:何为Maven坐标

为了能够自动化地解析任何一个Java构件,Maven就必须要将其唯一标识,这就是依赖管理的底层基础——坐标。

学过数学的人都知道平面直角坐标系,x,y分别为其横,纵坐标,将会在平面直角坐标系中唯一的确定一个点。在Maven世界中用户数量非常巨大的构件,也就是平常用到的jar和war等文件。在Maven为这些构件引入坐标概念之前,我们无法使用任何一种方式来唯一地标识这些构件。只能自己去网上找,浪费时间还容易版本不兼容,基于此,Maven定义了这样的一组规则:

世界上任何一个构件都可以使用Maven坐标唯一标识

Maven坐标的元素包括

  • groupId
  • artifactId
  • version
  • package
  • classifier

所以我们只要能够提供正确的坐标信息,Maven就能帮我们找到对应的构件,Maven会去哪里找呢?答案是在Maven的构件仓库中,Maven内置了一个中央仓库的地址,该中央仓库包含了世界上大部分流行的开源项目构件。

不仅如此,在我们自己做开发的时候,也需要为其定义适当的坐标,这是Maven强制要求的,因为只有这样,其他Maven项目才能引用该项目生成的构件。见下图

2:坐标详解

示例:

<groupId>org.sonatype.nexus</groupId>
      <artifactId>nexus-indexer</artifactId>
      <version>3.0.4</version>
      <packaging>jar</packaging>

这是nexus-indexer的坐标定义,nexus-indexer是一个针对Maven仓库编纂索引并提供搜索功能的类库,是Nexus项目的一个子模块,后面会介绍。

上述代码片段中,其坐标分别为:groupId:org.sonatype.nexus,artifactId:nexus-indexer,version:3.0.4,packaging:jar

坐标元素解释:

  • groupId

定义当前Maven项目隶属的实际项目,表示方式与Java包名的表示方式类似,通常与域名反向一一对应。这个就是父项目,其下可以有很多子模块。

  • artifactId

定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifaceId的前缀,比如上例中的artifactId是nexus-indexer,使用了实际项目名nexus作为前缀,这样做的好处是方便寻找实际构件。

  • version

定义Maven项目当前所处的版本,如上例中nexus-indexer的版本是3.0.4,需要注意的是:Maven定义了一套完成的版本规范以及快照(SNAPSHOT)的概念。

  • packaging

定义Maven项目的打包方式,首先,打包方式通常与所生成构件的文件扩展名对应,如上例中packaging为jar,最终的文件名为:nexus-indexer-3.0.4-jar,而使用war打包方式的Maven项目,最终会生成一个*.war的文件,不过这不是绝对的。其次,打包方式会影响到构建的生命周期,比如jar和war会使用不同的命令。最后,Maven默认jar包。

  • classifier

帮助定义构建输出的一些附属构建。附属构件与主构件对应,如上例中的主构件是nexus-indexer-3.0.4.jar,该项目可能还会通过使用一些插件生成如nexus-indexer-3.0.4-javadoc.jar、nexus-indexer-3.0.4-source.jar这样一些附属构件,其包含了Java文档和源码。这时候,javadoc和source就是这两个附属构件的classifier。附属构件也有自己的唯一坐标。

注意:不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件生成的。

上述五个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认jar),而classifier是不能直接定义的。

3:account-email的pom.xml

基于上一章的背景案例。案例中有一个负责发送账户激活的电子邮件,现在就要对该模块进行实现,包括POM配置、主代码和测试代码。基于SpringBoot,因此还会涉及SpringBoot的配置。

pom.xml代码清单:

<?xml version="1.0" encoding="UTF-8"?>
<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.soulprayer.maven.account</groupId>
<artifactId>account-email</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>Account Email</name>
<description>Account Email</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--SpringBoot邮件相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>1.5.4.RELEASE</version>
</dependency> <!--邮件发送相关-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency> <!--单元测试相关,依赖范围为测试代码,不影响主代码-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>1.5.5</version>
<scope>test</scope>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

4:account-eamil的主代码

AccountEmailService.java

public interface AccountEmailService {

    //发送邮件
void sendMail(String to,String subject,String htmlText) throws Exception; }
AccountEmailServiceImpl.java
//注入为服务
@Service
@SuppressWarnings("SpringJavaAutowiringInspection")
public class AccountEmailServiceImpl implements AccountEmailService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); //Spring邮件发送工具类库
@Autowired
private JavaMailSender javaMailSender; //注入发件人地址
@Value("${spring.mail.username}")
private String systemEmail; @Override
public void sendMail(String to, String subject, String htmlText) throws Exception {
try {
//构建消息
MimeMessage msg = javaMailSender.createMimeMessage();;
MimeMessageHelper msgHelper = new MimeMessageHelper(msg,true);
//发件地址
msgHelper.setFrom(systemEmail);
//收件地址
msgHelper.setTo(to);
//主题
msgHelper.setSubject(subject);
//内容,true为Html格式
msgHelper.setText(htmlText,true);
javaMailSender.send(msg);
logger.info("邮件发送成功!");
}catch (MessagingException e){
throw new Exception("Faild to send mail." + e);
}
} }

5:account-email的测试代码

AccountEmailApplicationTests.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class AccountEmailApplicationTests { @Autowired
private AccountEmailService emailService; @Test
public void contextLoads() throws Exception {
String subject = "Test Subject";
String htmlText = "<h1>This is a mail test!</h1>";
emailService.sendMail("xxxxx@qq.com", subject, htmlText);
} }

邮件发送成功JunitTest截图

邮件发送成功Maven命令截图

收到的邮件截图

6:account-email的构建

使用mvn clean install构建account-email,Maven会依据POM配置自动下载所需要的依赖构件,执行编译、测试、打包等工作,最后将项目生成的构件account-email-1.0.0-SNAPSHOT.jar安装到本地仓库中,这时,该模块就能被其他Maven项目使用了。

7:小结

至此,我们就完成了注册服务中的邮件模块了,并且讲解了一下Maven的坐标体系,本邮件模块基于SpringBoot完成,如对SpringBoot不了解的,可以参考我的

SpringBoot实战(待写),希望大家多多鼓励!

Maven实战06_坐标和邮件服务模块的更多相关文章

  1. 学习笔记——Maven实战(一)坐标规划

    坐标是什么?为什么要规划? 坐标是Maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件.举个最简单的例子,如果没有坐标,使用JUnit的 ...

  2. 【转】Maven实战(九)---模块聚合和继承

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47001831   感谢! 类之间有聚合和继承关系,Maven也具备这样的设计原 ...

  3. [Maven实战](7)坐标

    1. 简单介绍 maven的世界中拥有数量很巨大的构件,也就是平时用的一些jar,war等文件. 在maven为这些构件引入坐标概念之前,我们无法使用不论什么一种方式来唯一标识全部这些构件. 因此,当 ...

  4. Maven实战(九)---模块聚合和继承

    类之间有聚合和继承关系,Maven也具备这种设计原则. 那么Maven的pom是怎样进行聚合与继承的呢? 一.什么是聚合?为什么要用聚合? 上一篇博客介绍了模块化的基本知识. 有了模块化,那么我们项目 ...

  5. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  6. 【构建工具】《Maven实战》读书笔记

    Maven是我们在做Java开发过程中用经常用到的一个辅助工具.本篇博客是我学习Maven的一个记录博客,学习过程主要参考<Maven实战>这本书.同时也参考了Maven的官方文档. 1. ...

  7. Maven实战(六)依赖

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  8. 学习笔记——Maven实战(八)常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  9. Maven实战之Quick Start

    Introduction Maven是一个异常强大的构建工具,能够帮我们自动化构建过程,从清理.编译.测试到生成报告,再到打包和部署.通过Maven,我们只需要输入简单的命令(如mvn clean i ...

随机推荐

  1. python语句结构(range函数)

    python语句结构(range函数) range()函数 如果你需要遍历数字序列,可以使用内置range()函数,它会生成序列 也可以通过range()函数指定序列的区间 也可以使用range()函 ...

  2. springcloud(十六)、feign+hystrix+ribbon+zuul应用案例

    在 基于 " sringcloud(十四).ribbon负载均衡策略应用案例 "所有工程的基础上,进行如下操作进行网关设置 1.创建eureka-client-consumer-z ...

  3. 2018-8-10-win10-uwp-打开文件管理器选择文件

    title author date CreateTime categories win10 uwp 打开文件管理器选择文件 lindexi 2018-08-10 19:16:50 +0800 2018 ...

  4. .NET中DataTable的常用操作

    一.目的 在各种.NET开发中,DataTable都是一个非常常见且重要的类型,在与数据打交道的过程中可以说是必不可少的对象. 它功能强大,属性与功能也是相当丰富,用好的话,使我们在处理数据时,减少很 ...

  5. Atcoder arc096

    C:Half and Half 几个if语句贪心算一算就好了 #include<cstdio> #include<algorithm> using namespace std; ...

  6. 连通图,set——cf1037E

    看了题解又调了很久,用set来维护当前满足条件的pair<degree[v],v> 离线操作,先建好一张图,然后建立好集合,每次删边后都把集合里不满足条件的点删去,同时更新集合 /* 离线 ...

  7. window 下mongodb 配置

    1.下载mongodb-win32-x86_64-2008plus-ssl-v3.6-latest 解压到 D:\mongodb 2.cmd => path是否有环境变量 如果没有请配置 3.创 ...

  8. 我王某的 低错&&(女装)Flag

    日月共鉴,人心同睹. 喜欢你. 喜欢你的眼睛. 春天银河般闪烁的双瞳.春日阳光般温柔的眼神. 喜欢你的头发. 在微风中飘拂丝绢般柔滑的长发. 喜欢你的嘴唇. 给我甜蜜的吻.吐出忧伤叹息的嘴唇. 喜欢你 ...

  9. 19-10-27-S

    作者太巨辣! %%%乔猫 好. ZJ一下: 哭笑不得. T1直接审错题(没发现题目里那个憨P的更新限制),然后直接跑了$\mathsf{SPFA}$,然后我又发现了.以为我死了,结果手玩一下发现……那 ...

  10. WebService Exceptions

    一. Exception in thread "main" java.lang.ExceptionInInitializerError at com.sun.xml.interna ...