Maven实战06_坐标和邮件服务模块

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实战(待写),希望大家多多鼓励!

时间: 2024-10-14 00:45:02

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

《Maven实战》整理三:坐标和依赖

1.1 何为Maven坐标 正如之前所说的,Maven的一大功能就是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就依赖管理的底层基础——坐标. 1.2 坐标详解 Maven坐标的元素包括:groupId,artifactId.version.packaging.classifier.先看一组坐标定义,如下: <groupId>org.sonatype.nexus</groupId> <artifactId>nexus-inde

(四)《Maven实战》读书笔记 —— Maven坐标和依赖

第四章:坐标和依赖 正如第1章所述,Maven的一大功能是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就是依赖管理的底层基础--坐标. 4.1 何为Maven坐标 关于坐标(Coordinate),大家最熟悉的定义应该来自于立体几何.在一个立体坐标系中,该立体空间内的任何一个点,都能够用坐标(x,y,z)唯一标识.在实际生活中,我们可以将地址看成一种坐标.省市县等一系列信息同样可以唯一标识城市中的任一居住地址,邮局和快递公司正是基于这样一种坐标进行邮件

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

项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 1.1创建聚合工程的父模块 1.2设置父模块的POM文件 主要是配置 spring boot版本,spring cloud 版本,和一些通用的依赖 比如这里的 lombok依赖 <?xml version="1.0" encoding="UTF-8"?>

Maven实战 - 目录

<Maven实战>,许晓斌(Juven Xu),国内社区公认的Maven技术专家.Maven中文用户组创始人.Maven技术的先驱和积极推动者.2011.1初版. 基础性的构建工具,做Java的都会,会的程度参差不一,系统性的看一遍书,很快就能看完,可能有出乎意料的收获 第1章 Maven简介 1.1 何为 Maven 何为构建 Maven 是优秀的构建工具 Maven 不仅仅是构建工具 1.2 为什么需要Maven 组装 PC 和品牌 PC IDE 不是万能的 Make Ant 不重复发明轮

《Maven实战》整理一:Maven的安装及配置

1 Maven 介绍 Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”.本书将介绍Maven这一跨平台的项目管理工具.作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建.依赖管理和项目信息管理.无论是小型的开源类库项目,还是大型的企业级应用:无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手.1 Maven是优秀的构建工具,能够帮我们自动化构建过程,从清理.编译.测试到生成报告,再到打包和部署. Maven能帮助

Maven实战05_背景案例学Maven模块化

1:简单的账户注册服务 注册互联网账户是日常生活中再熟悉不过的一件事,作为一个用户,注册账户的时候需要进行以下操作,提供以下信息. 提供一个未被使用的帐号ID 提供一个未被使用的email地址. 提供一个任意的显示名称 设置安全密码,并重复输入以确认 输入验证码 前往邮箱查收激活链接并单击激活帐号 登录确认激活状态 帐号的ID和密码唯一的标识某个账户,显示名称用来在页面上显示,方便浏览.注册时需要用户输入两次密码,以确保没有输错.系统则负责检查ID和email的唯一性,验证两次输入的密码是否一致

Maven实战(六)依赖

我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependencies> <dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> <version>1.0</version> <exc

《Maven实战》整理二:Maven的使用

1 Maven使用 1.1 编写POM 就像Make的Makefile,Ant的build.xml一样,Maven项目的核心是pom.xml. 首先创建一个名为hello-world的文件夹(本书中各章的代码都会对应一个以ch开头的项目),打开该文件夹,新建一个名为pom.xml的文件,输入其内容如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.

学习笔记——Maven实战(九)打包的技巧

“打包“这个词听起来比较土,比较正式的说法应该是”构建项目软件包“,具体说就是将项目中的各种文件,比如源代码.编译生成的字节码.配置文件.文档,按照规范的格式生成归档,最常见的当然就是JAR包和WAR包了,复杂点的例子是Maven官方下载页面的分发包,它有自定义的格式,方便用户直接解压后就在命令行使用.作为一款”打包工具“,Maven自然有义务帮助用户创建各种各样的包,规范的JAR包和WAR包自然不再话下,略微复杂的自定义打包格式也必须支持,本文就介绍一些常用的打包案例以及相关的实现方式,除了前