Maven 核心能力拆解 + 实战: Java 邮件群发

文章目录

Maven解决依赖管理与项目构建痛点

Maven 解决了 Java 开发的两个核心问题:依赖繁琐构建混乱

手动管理

  • 需自行查找下载 Jar 包及其依赖
  • 手动配置编译路径
  • 版本冲突、协作困难

Maven 方案

  • pom.xml 声明依赖 → 自动下载管理
  • 标准项目结构 → 编译、测试、打包一键完成

本质:Maven 用自动化取代手工,让开发者聚焦于代码。

构建流程

一、3个核心概念

Maven构建过程的三个核心概念:

概念 是什么 核心规则
生命周期 一套预设的完整流程 (如构建、清理) 相互独立,如 cleandefault
阶段 流程中的具体步骤 (如编译、打包) 有序且自动递进 执行后阶段会自动运行所有前序阶段
目标 插件提供的具体任务 (真正执行操作的代码) 阶段必须绑定目标才有实际作用

关系总结:

  • 命令执行 的是一个阶段 (如 mvn package
  • 该阶段所属的生命周期被触发
  • Maven自动执行该阶段之前的所有阶段
  • 每个阶段通过调用绑定的插件目标来完成实际工作

二、核心原理

Maven构建的底层逻辑是「约定优于配置」:
如何理解"执行后序Phase会自动跑前置步骤"?

我们以 default(构建)生命周期为例,它包含以下核心阶段,并按固定顺序排列:

validate → compile → test → package → install → deploy

关键机制:每个阶段都隐式依赖于它之前的所有阶段。

实际演示:

当你在项目根目录执行命令:

bash 复制代码
mvn package

Maven并不会只执行 package 这一个阶段,而是会从生命周期起点开始,按顺序执行直到 package 为止的所有阶段

执行 mvn package 时实际发生的完整流程:

  1. validate (验证项目结构)
  2. compile (编译源代码)
  3. test (运行单元测试)
  4. package (打包成JAR/WAR)

这就是Maven的自动递进执行逻辑:你只需要"告诉"Maven你最终想要到达哪个阶段,它就会自动完成所有必要的准备工作,确保构建过程的完整性和正确性。

三、新手必背命令

  • mvn clean:仅清理;
  • mvn clean compile:清理+编译;
  • mvn clean test:清理+编译+测试;
  • mvn clean package:清理+编译+测试+打包(最常用)。

Maven的打包功能

Maven基础命令:clean与package

命令 作用 操作内容(以邮件群发项目为例) 执行结果
mvn clean 清理构建产物 删除 target/ 文件夹(旧.class、旧JAR包、测试报告等) 项目回归"源码+配置"的干净状态
mvn package 打包可运行文件 自动执行 compiletestpackage,打包成 mail-send-1.0.0.jar 生成可独立运行的 JAR 文件
mvn clean package 重新打包 先执行 clean,再执行 package 生成一个全新且无残留的 JAR 包

常用场景

  • clean package:修改代码后、更新依赖后,确保生成全新 JAR
  • package:日常快速打包(旧包会被覆盖)

执行方式

  • IDEA :右侧Maven面板,双击Lifecycle下的cleanpackage
  • 命令行 :在项目根目录执行mvn clean package

Java + Maven 实现QQ邮箱群发功能

一、核心原理

邮件群发基于SMTP协议连接邮箱服务器,认证后批量发送邮件。

  • Maven:自动引入JavaMail等依赖
  • JavaMail:封装SMTP协议,提供发送邮件API
  • QQ邮箱适配 :需开启SMTP服务并使用授权码(非登录密码)

二、开启QQ邮箱SMTP服务

QQ邮箱默认关闭SMTP,必须手动开启:

  1. 登录网页版QQ邮箱
  2. 进入「设置」→「账户」
  3. 找到「POP3/IMAP/SMTP服务」,开启「SMTP服务」
  4. 验证身份后,保存生成的16位授权码(用于程序连接)

搭建Maven项目

新建Maven项目,在pom.xml中引入JavaMail核心依赖(Maven自动下载,无需手动导包):

添加的依赖

复制代码
<dependencies>
        <!-- JavaMail API -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
    </dependencies>

三、核心代码实现

新建Main.java类,完整代码如下(关键步骤都加了注释):

java 复制代码
package linyuqin.maven;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
import java.util.Arrays;
import java.util.List;

/**
 * 邮件群发工具类
 */
public class Main {
    // 发件人邮箱(替换为自己的)
    private static final String SENDER_EMAIL = "2268404687@qq.com";
    // 发件人邮箱授权码(QQ邮箱需开启SMTP并生成授权码,不是登录密码)
    private static final String SENDER_AUTH_CODE = "...";
    // SMTP服务器(QQ邮箱:smtp.qq.com;163邮箱:smtp.163.com)
    private static final String SMTP_HOST = "smtp.qq.com";
    // SMTP端口(QQ邮箱:465;163邮箱:25/465)
    private static final String SMTP_PORT = "465";

    /**
     * 邮件群发方法
     * @param toEmails 收件人邮箱列表
     * @param subject 邮件标题
     * @param content 邮件内容(支持纯文本/HTML)
     */
    public static void sendGroupMail(List<String> toEmails, String subject, String content) {
        // 1. 配置SMTP参数
        Properties props = new Properties();
        props.put("mail.smtp.host", SMTP_HOST);
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.auth", "true"); // 开启认证
        props.put("mail.smtp.ssl.enable", "true"); // QQ邮箱需开启SSL

        // 2. 创建认证对象
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(SENDER_EMAIL, SENDER_AUTH_CODE);
            }
        };

        // 3. 获取Session对象
        Session session = Session.getInstance(props, auth);
        session.setDebug(true); // 开启调试模式,控制台可看发送日志S

        try {
            // 4. 发送邮件(循环发送,避免单封邮件包含过多收件人被判定为垃圾邮件)
            for (String toEmail : toEmails) {
                // 创建邮件消息
                MimeMessage message = new MimeMessage(session);
                // 设置发件人
                message.setFrom(new InternetAddress(SENDER_EMAIL));
                // 设置收件人
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
                // 设置邮件标题
                message.setSubject(subject, "UTF-8");
                // 设置邮件内容(第二个参数为true表示HTML内容,false为纯文本)
                message.setContent(content, "text/html;charset=UTF-8");
                // 设置发送时间
                message.setSentDate(new java.util.Date());

                Transport.send(message);
                System.out.println("邮件已发送至:" + toEmail);
            }

        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("邮件发送失败:" + e.getMessage());
        }
    }

    // 测试方法
    public static void main(String[] args) {
        // 收件人列表(替换为实际收件人)
        List<String> toEmails = Arrays.asList(
                "2268404687@qq.com"

        );
        // 邮件标题
        String subject = "【测试】Maven+Java邮件群发";
        // 邮件内容(支持HTML)
        String content = "<h3>你好!</h3><p>这是一封通过Java+Maven发送的群发测试邮件</p>";

        // 执行群发
        Main.sendGroupMail(toEmails, subject, content);
    }
}

四、运行测试

  1. 替换代码中的SENDER_EMAIL(自己的QQ邮箱)和SENDER_AUTH_CODE(生成的授权码);

  2. IDEA中点击「运行」按钮,或执行Maven命令:

    bash 复制代码
    # 编译代码
    mvn clean compile
    # 运行主类
    mvn exec:java -Dexec.mainClass="linyuqin.maven.Main"
  3. 控制台打印「邮件已成功发送至:xxx@qq.com」,且收件箱收到邮件,说明成功!

相关推荐
大学生资源网2 小时前
基于springboot的智能家居系统的设计与实现(源码+文档)
java·spring boot·后端·毕业设计·源码
洛阳纸贵2 小时前
JAVA高级工程师--Maven父子关系专题
java·前端·maven
爱干饭的boy2 小时前
MacBook安装node.js/maven/mysql
mysql·node.js·maven
编程小白gogogo2 小时前
苍穹外卖---swagger
java
sinat_255487812 小时前
文件I/O流
java·jvm·算法
Aevget2 小时前
「Java EE开发指南」如何在MyEclipse中开发EJB 2 Session Bean?(三)
java·ide·java-ee·开发工具·myeclipse
xincan08182 小时前
MacOS安装Java+mvn+mvnd+jenv多环境丝滑切换
java·开发语言·macos
派大鑫wink2 小时前
【Day13】集合框架(一):List 接口(ArrayList vs LinkedList)实战
java·开发语言·windows
眠りたいです2 小时前
Docker:镜像的运行实体-Docker Container
java·运维·c++·docker·容器·eureka