1. 程式人生 > >(二)Maven的座標和依賴&利用Maven實現郵件傳送

(二)Maven的座標和依賴&利用Maven實現郵件傳送

本文中將《Maven實戰》中對座標和依賴的定義展示給初學Maven的程式猿們,並加上書中例項展示,具體詳細請購買《Maven實戰》--許曉斌著,更加詳細的學習Maven。

座標詳解

groupld:定義當前Maven項口隸屬的實際項口。首先,Maven 專案和實際專案不一定是一對一的關係。比如SpringFramework這實際專案, 其對應的Maven項口會有很多,如spring-core、spring-context 等。這是由於Maven中模組的概念,因此,一個實際專案往往會被劃分成很多模組。其次,groupld不應該對應專案隸屬的組織成公同。原因很簡單,一個組織下會有很多實際專案,如果groupld 只定義到組織級別,而後面我們會看到、arifactld 只能定義Maven專案(模組),那麼實際專案這個層將難以定義。最後,groupld 的表示方式與Java包名的表示方式類似,通常與域名反向一一對應。 上例中,groupld 為ong. sonatype. nexus, ong sonatype 表示Sonatype公司建立的一個非盈利性組織,nexus 表示Nexus這實際專案,該groupld 與城名nerus sonatype. ong對應。
artifactld

: 該元素定義實際專案中的一個Maven專案(模組),推薦的做法是使用實際專案名稱作為artifactld的前級。比如上例中的artifaectld是nexus-indexer,使用了實際專案名nexus作為前級,這樣做的好處是方便尋找實際構件。在預設情況下,Maven生成的構件,其檔名會以artifaetld作為開頭,如nexus-indexer-2.0.0. jar,使用實際專案名稱作為字首之後,就能方便從一個lib資料夾中找到某個專案的組構件。考慮有5個專案,每個專案都有一個core模組,如果沒有前級,我們會看到很多core-1.2. jar這樣的檔案,加上實際專案名前級之後,便能很容易區分foo-core-1.2. jar、bar-core-1. 2. jar...... 

version:該元素定義Maven專案當前所處的版本,如上例中nexus-indexer的版本是2.0.0。需要注意的是,Maven 定義了一套完整的版本規範,以及快照(SNAPSHOT)的概念。
packaging:該元素定義Maven專案的打包方式。首先,打包方式通常與所生成構件的副檔名對應,如上例中packaging為jar,最終的檔名為nexus-indexer-2.0.0. ar,面使用war打包方式的Maven專案,最終生成的構件會一個.war檔案,不過這不是地對的。其次,打包方式會影響到構建的生命用期,比如jar打包和war打包會使用不同的命令。最後,當不定義packogne的時候,Maven會使用預設值jar。

上述4個元素中,goupld. arifaeld version 是必須定義的,packaging 是可選的(預設為jar)。
同時,專案構件的檔名是與座標相對應的,一般的規則為 atifactld-version [ -classifi-er] . packaging, [-classifer] 表示可選。比如上例nexus-indexer的主構件為nexus-indexer-2.0.0. jar,附屬構件有nexus-indexer-2.0.0-javadoc. jar。這裡還要強調的一點是,packaging非一定與構件副檔名對應,比如packaging為maven-plugin的構件副檔名為jar.

依賴範圍

compile:編譯依賴範圍。如果沒有指定,就會預設使用該依賴範圍。使用此依精範圍的Meven依賴,對於編譯、測試、執行三種classpath 都有效。典型的例子局spring-core,在編譯、測試和執行的時候都需要使用該依賴。
test:測試依賴範圍。使用此依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主程式碼成者執行專案的使用時將無法使用此類依賴。典型的例子基JUnit,它只有在編譯測試程式碼及執行測試的時候才需要。
provided:已提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試claerpath有效,但在執行時無效。典型的例子是servlet-api,編譯和測試專案的時候需要該依賴,但在執行專案的時候,由於容器已經提供,就不需要Maven重複地引入。
runtime:執行時依賴範圍。使用此依賴範圍的Maven依賴,對於測試和執行clapath有效,但在編譯主程式碼時無效。典型的例子是JDBC驅動實現,專案主程式碼的編譯只需要JDK提供的JDBC介面,只有在執行測試成者執行專案的時候才需要實現上述介面的具體JDBC驅動。
system:系統依賴範圍。該依賴與三種casspath的關係,和provided依賴範圍完全一致。但是,使用system範圍的依頓時必須通過systemPath 元素顯式地指定依賴檔案的路徑。由於此類依賴不是通過Maven 倉庫解析的,而且往往與本機系統繫結,可能造成構建的不可移植,因此應該謹慎使用。systemPath 元素可以引用環境變數,如:

<dependency>
        <groupId >javax.sql</groupId >
        <artifactId>jdbe-stdext</artifactId>
        <version>2.0 </version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>


利用Maven實現郵件傳送

檔案結構

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.feiyu.web</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>2.5.6</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.icegreen</groupId>
            <artifactId>greenmail</artifactId>
            <version>1.3.1b</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

 一個很簡單的介面AccountEmailService.java

package com.feiyu.account.email;


public interface AccountEmailService {
    void sendMail(String to, String subject,String htmlText) throws AccountEmailException;
}

介面的實現類AccountEmailServiceImpl.java

package com.feiyu.account.email;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

public class AccountEmailServiceImpl implements AccountEmailService{
    private JavaMailSender javaMailSender;
    private String systemEmail;
    public void sendMail(String to, String subject, String htmlText) throws AccountEmailException {
        try{
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);

            messageHelper.setFrom(systemEmail);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(htmlText,true);
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            throw new AccountEmailException("Faild to send mail.", e);
        }
    }

    public JavaMailSender getJavaMailSender() {
        return javaMailSender;
    }

    public void setJavaMailSender(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    public String getSystemEmail() {
        return systemEmail;
    }

    public void setSystemEmail(String systemEmail) {
        this.systemEmail = systemEmail;
    }
}

異常捕獲類AccountEmailException.java

package com.feiyu.account.email;

public class AccountEmailException
        extends Exception
{
    public AccountEmailException( String message )
    {
        super( message );
    }

    public AccountEmailException( String message, Throwable throwable )
    {
        super( message, throwable );
    }
}

配置檔案email.properties

email.protocol = smtps
email.host = smtps.qq.com
email.port = 456
email.username = [email protected]
email.password = your_password
email.auth = true
email.systemEmail = [email protected]

Spring配置檔案email.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:email.properties" />
    </bean>
    <!--定義郵件伺服器的一些配置、包括協議、埠、主機、使用者名稱、密碼,是否需要認證等屬性-->
    <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="protocol" value="${email.protocol}" />
        <property name="host" value="${email.host}" />
        <property name="port" value="${email.port}" />
        <property name="username" value="${email.username}" />
        <property name="password" value="${email.password}" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.${email.protocol}.auth">${email.auth}</prop>
            </props>
        </property>
    </bean>
    <!--注入javaMailSender-->
    <bean id="accountEmailService"
          class="com.feiyu.account.email.AccountEmailServiceImpl">
        <property name="javaMailSender" ref="javaMailSender" />
        <property name="systemEmail" value="${email.systemEmail}" />
    </bean>
</beans>

測試類AccountEmailServiceTest.java

package com.feiyu.account.email;

import static org.junit.Assert.*;

import javax.mail.Message;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.GreenMailUtil;
import com.icegreen.greenmail.util.ServerSetup;

public class AccountEmailServiceTest {
    private GreenMail greenMail; // 使用GreenMail作為測試伺服器

    @Before
    // Before註解表示會先於測試方法@Test執行
    public void startMailServer() throws Exception {
        greenMail = new GreenMail(ServerSetup.SMTP);
        greenMail.setUser("[email protected]", "your_password"); // 建立郵件賬戶
        greenMail.start(); // 啟動郵件服務
    }

    @Test
    public void testSendMail() throws Exception {

        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(
                "email.xml");

        AccountEmailService accountEmailService = (AccountEmailService) classPathXmlApplicationContext
                .getBean("accountEmailService");

        String subject = "your_Test_subject"; //郵件主題
        String htmlText = "<h3>your_content</h3>"; //郵件內容
        accountEmailService.sendMail("[email protected]", subject, htmlText); // 傳送

        greenMail.waitForIncomingEmail(3000, 1); // 最多等待3s

        Message[] msgs = greenMail.getReceivedMessages(); // 讀取收到的郵件
        assertEquals(1, msgs.length); // 檢查數目
        assertEquals(subject, msgs[0].getSubject());
        assertEquals(htmlText, GreenMailUtil.getBody(msgs[0]).trim());
    }

    @After
    public void stopMailServer()
            throws Exception {
        greenMail.stop();			//停止
    }
}

相關推薦

Maven座標依賴利用Maven實現郵件傳送

本文中將《Maven實戰》中對座標和依賴的定義展示給初學Maven的程式猿們,並加上書中例項展示,具體詳細請購買《Maven實戰》--許曉斌著,更加詳細的學習Maven。 座標詳解 groupld:定義當前Maven項口隸屬的實際項口。首先,Maven 專案和實際專案不一

3.2《深入理解計算機系統》筆記內存高速緩存的原理【插圖】

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處

Python學習記錄——Ubuntu用戶用戶組

root用戶 -s spa 登陸 gpo 用戶名 執行權 添加 ubun 1.etc文件作用: (1) /etc/passwd 用戶賬戶信息。 (2)/etc/shadow 安全用戶賬戶信息。 (3)/etc/group 組賬戶信息。 (4)/etc/gshadow 安全組

版本管理之GitGitHub的連接使用

ext 郵箱地址 github 遠程倉庫 編輯器 version it 管理 png 記錄 首先需要註冊登錄GitHub:https://github.com 然後 ①:下載Git 先從Git官網,由於我的系統是64位的所以選擇64-bit Git for Wi

KafkaKafka生產者消費者模型

col ace ont 1.5 kafka fff spa sof oss 消費者模型消費模型有分區消費模型、組消費模型。分區消費模型:可以看到在這種模型下分區和消費者是對應的,為了保證最大效率通常一個分區對應一個消費者。生產者模型Kafka(二)Kafka生產者和消費者模

JAVA並行框架Fork/Join:同步異步

arp ont ack sso util private div ext string 在Fork/Join框架中,提交任務的時候,有同步和異步兩種方式。 invokeAll()的方法是同步的,也就是任務提交後,這個方法不會返回直到所有的任務都處理完了。 fork方法是異步

Software Testing 閱讀筆記離散數學泛化程式碼

泛化的虛擬碼,根據我的理解,就是單元和程式元件,就是單詞加上一個尖括號來代表步驟,省略了大部分程式。 經典問題 三角形問題 判斷三角形的形狀:輸入為三條邊,輸出為三角形的形狀 以下是其三角形程式的資料流圖展示: 注意圖中,我們可以分析到有六個箭頭指向非三角形,三個指向等腰三

Shell常用命令技巧

命令列一些技巧: * 表示任意字元(也可以無字元) ? 任意一個單字元 [a-z] 包含一個字元範圍中的任一字元 [^a-z] 不包含此範圍的字元 Tab鍵 補齊命令名稱或其他名稱 history 重新輸入以前執行過的指令 !+序號

Spring Boot :Redis日誌

接著上篇內容繼續往下執行。 首先pom.xml 新增redis的引用,因為開始建專案沒有,自動生成redis的引用,然後手動新增進去。 新增成功以後看我們的配置檔案 新增我們的日誌類和快取 快取方法 結果: http://localhost:8080/set?key=lxh2&

Python Socket網路程式設計區域網內區域網與廣域網的持續通訊

目錄 前言 IP地址 簡介 公有IP 私有IP 區域網之間網路通訊 前提 功能描述

Android apk動態載入機制的研究 資源載入activity生命週期管理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

EventBus原始碼解析—釋出事件登出流程

1.EventBus原始碼解析(一)—訂閱過程 2.EventBus原始碼解析(二)—釋出事件和登出流程 前言 上一篇部落格已經比較詳細的講解了EventBus的註冊過程,有了上一篇部落格的基礎,其實關於EventBus的原始碼中的其他流程就非常好理解了,尤其是我

Angular ui-roter AngularJS 通過 ocLazyLoad 實現動態載入模組依賴

什麼是ui-router   ui-router是AngularUI庫最有用的元件之一(AngularUI庫由AngularJS社群構建)。它是一個第三方路由框架,允許通過狀態機制組織介面,而不是簡單的URL路由。   什麼是ocLoayLoad   ocLoayLoad是AngularJS

TensorFlow 學習 張量基本運算

tensor: 張量 operation:  專門運算的操作節點 graph:  整個程式的結構, 圖 TensorBoard:  視覺化學習 run() :  運算程式的圖、會話 張量的階:     0 階:

Vue學習——內容顯示繫結事件

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Vue入門</title> <script src="./vue.js"

軟體工程之路——個人技術流程

個人技術和流程 1. 單元測試 1.1 寫一個單元測試 1.2 用以驗證的Assert類/斷言 1.3 如何寫好單元測試 1.4 迴歸測試 2. 效能分析工具 1. 單元測試 一般情況下一個軟體

Java開發學習心得:MybatisUrl路由

rac 處理 2.4 報錯 localhost insert 實體 tips control Java開發學習心得(二):Mybatis和Url路由 序號接上一篇Java開發學習心得(一):SSM環境搭建 1.3 Mybatis MyBatis 本是apache的一個開源項

Scala學習筆記:類物件

object object 是隻有一個例項的類。它的定義與Java中的class類似,如: // 單例物件 object AppEntry { def main(args: Array[String]): Unit = { print("Hello World!") } }

C語言陣列篇指標陣列陣列指標

陣列指標 和 指標陣列           這兩個名詞可以說是經常搞混了         陣列指標--> 陣列的

深入Mysql鎖機制讀鎖寫鎖

深入Mysql鎖機制(二)讀鎖和寫鎖 這篇文章主要來介紹一下MySQL資料庫中的表級鎖。 本文提到的讀鎖和寫鎖都是MySQL資料庫的MyISAM引擎支援的表鎖的。而對於行級鎖的共享讀鎖和互斥寫鎖請閱讀MySQL中的共享鎖與排他鎖。我習慣在描述表鎖的時候按照讀寫來區分,在表