zoukankan      html  css  js  c++  java
  • 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项目才能引用该项目生成的构件。见下图

    image

    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截图

    image

    邮件发送成功Maven命令截图

    image

    收到的邮件截图

    image

    6:account-email的

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

    image

    image

    7:小结

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

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

  • 相关阅读:
    【WPF】操作RichTextBox(取值、赋值、清空、滚动条自动滚动实例、文本自动滚动实例)
    系统初始化 服务列表
    多个filter如何决定调用顺序
    IE浏览器 查看Form对象
    java try_catch 分析
    关于ClassLoader 和Class的俩个记录
    lis分析之一一批处理(任务)如何连接数据库的
    document.all("div).style.display = "none"与 等于""的区别
    Mybatis Util包
    Spring创建bean对象的三种方式
  • 原文地址:https://www.cnblogs.com/homeword/p/7136042.html
Copyright © 2011-2022 走看看