1. 程式人生 > >Maven座標、依賴的介紹之傳送郵件示例專案

Maven座標、依賴的介紹之傳送郵件示例專案

什麼是座標?

最早聽到座標是在數學幾何中,比如在一個平面座標系中(X、Y),表示該平面上與X軸的距離為Y,與Y軸的距離為X的一點,

任何一個座標都能夠唯一標識該平面中的一點。在實際生活中,比如說網上購物,你在下訂單的時候寫上家庭住址,然後快遞員

就能夠根據地址送貨上門,其實這個地址也可以理解為座標。

在Maven中,座標為各種構件引入了秩序,任何一個構件都必須明確定義自己的座標,只有定義了座標後其它專案在需要使用你的專案或者模組時,才能夠準確定位引入。

而Maven座標中是通過一些元素來定義的,他們是:groupId、artifactId、version、packaging、clas-sifier。

1.groupId:定義當前專案屬於的實際專案.如:org.springframework

2.artifactId:定義專案的名稱或者可一說是模組名稱,這是由於Maven中模組的概念如:spring-core、spring-beans

3.version:定義專案的版本

4.packaging:預設為Jar

5.clas-sifier:該元素用來幫助定義構建輸出的一些附屬元件。

注:上述5個元素中,前三個是必須定義的,packaging在不明確定義的時候預設為Jar,clas-sifier是不能直接定義的。

理解城市中地址的定義方式後就可以讓快遞員為我們工作了,同時,理解清楚Mavne座標後,我們就可以能開始討論Maven的依賴管理了

示例:

   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>2.5.6</version>

使用Maven一步步構建第一個實際應用,此處使用一個傳送郵件的案例來進行介紹

一:首先編寫pom.xml

程式碼清單:

<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.kafei</groupId>
	<artifactId>sendmail</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>sendmail project</name>
	<url>http://maven.apache.org</url>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>2.5.6</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>2.5.6</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>2.5.6</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>com.icegreen</groupId>
			<artifactId>greenmail</artifactId>
			<version>1.3.1b</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
A.上述groupId:com.kafei可以理解為com.kafei是公司名稱或者一個開發組織。

B.artifactId:sendmail可以理解為專案的名稱。

C.version:0.0.1-SNAPSHOT可以理解為專案的版本,表示該專案正在開發中,還不穩定。

綜合可以這樣理解:com.kafei公司下有一個名為sendmail的專案,而且他還處於開發階段,這樣說的意思是com.kafei公司可能還有其他開發的專案,這只是其中之一。

D.再看dependencies元素,其中包含了多個dependency子元素,這是POM定義專案依賴的位置。

E.以第一個依賴為例groupId、artifactId、version為org.springframework、spring-core、2.5.6,這便是依賴的座標,任何一個Maven都需要定義自己的座標,當這個Maven

專案成為其他Maven專案依賴的時候,這組座標就體現了其價值。

F.在dependency元素中有一個依賴為javax.mail mail 1.4.1這是實現傳送必須的類庫。

G.在dependency元素中有一個依賴為junit junit 4.7 test,這是JAVA實現單元測試的標準。這個依賴特殊的地方在於多了scope子元素,scope是用來定義依賴範圍的。

這裡的意思是此依賴只會服務於測試。同樣com.icegreen、greenmail、1.3.1b、test也只服務於測試。

二:編寫主程式碼

1.業務邏輯介面

package com.kafei.sendmail;

/**
 * 
 * 郵件傳送介面
 *
 */
public interface AccountEmailService
{
	/**
	 * 目的:用來發送HTML格式的郵件
	 * @param to 接收郵件的地址
	 * @param subject 郵件主題
	 * @param htmlText 郵件內容
	 * @throws AccountEmailException 如果傳送郵件失敗則丟擲異常
	 */
    void sendMail( String to, String subject, String htmlText )
        throws AccountEmailException;
}
2.對應該介面的實現類
package com.kafei.sendmail;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

public class AccountEmailServiceImpl implements AccountEmailService {
	private JavaMailSender javaMailSender;// 傳送郵件的工具類,提供get、set方法,實現依賴注入

	private String systemEmail;

	public void sendMail(String to, String subject, String htmlText)
			throws AccountEmailException {
		try {
			MimeMessage msg = javaMailSender.createMimeMessage();// 將要傳送的郵件
			MimeMessageHelper msgHelper = new MimeMessageHelper(msg, "UTF-8");

			msgHelper.setFrom(systemEmail);// 設定郵件的傳送地址
			msgHelper.setTo(to);// 設定郵件收件地址
			msgHelper.setSubject(subject);// 設定郵件主題
			msgHelper.setText(htmlText, true);// 設定郵件內容

			javaMailSender.send(msg);// 執行傳送郵件
		} catch (MessagingException e) {
			throw new AccountEmailException("郵件傳送失敗", 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;
	}

}
以上實現類程式碼中沒有郵件伺服器配置資訊,這些我們都將使用依賴注入進行配置,注入到javaMailSender中。

3.定義名為account-email.xml的配置檔案

該配置檔案位於src/main/resources/account-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-2.5.xsd">
	<!-- 配置載入屬性檔案的元件 -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:service.properties" />
	</bean>
	<!-- 配置傳送郵件的協議、埠、主機、使用者名稱、密碼、是否需要認證等屬性 -->
	<bean id="javaMailSenderImpl" 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="defaultEncoding" value="${email.defaultEncoding}" /><!--郵件內容編碼,防止傳送中文出現亂碼  -->
		<property name="javaMailProperties">
			<props>
				<prop key="mail.${email.protocol}.auth">${email.auth}</prop><!--是否需要認證  -->
			</props>
		</property>
	</bean>
	<!--配置傳送郵件的業務實現類,目的是注入 javaMailSenderImpl,設定傳送郵件的系統郵件地址-->
	<bean id="accountEmailServiceImpl"
		class="com.kafei.sendmail.AccountEmailServiceImpl">
		<property name="javaMailSender" ref="javaMailSenderImpl" /><!-- 注入javaMailSenderImpl -->
		<property name="systemEmail" value="${email.systemEmail}" />
	</bean>
</beans>
在配置了屬性檔案的元件後,還沒有建立名為service.properties的屬性檔案,屬性檔案資訊如下:
#傳送郵件使用的協議
email.protocol=smtp
#郵件伺服器
email.host=smtp.qq.com
#郵件監控埠
email.port=25
#郵件賬戶名
[email protected]
#郵件賬戶密碼
email.password=xxxxxx
#郵件內容編碼,防止傳送中文出現亂碼
email.defaultEncoding=UTF-8
#是否需要認證
email.auth=true
#郵件傳送地址,一般和郵件賬戶名相同
[email protected]
4.編寫測試程式碼
package com.kafei.sendmail;



import static junit.framework.Assert.assertEquals;

import javax.mail.Message;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
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;

    public GreenMail getGreenMail() {
		return greenMail;
	}

	public void setGreenMail(GreenMail greenMail) {
		this.greenMail = greenMail;
	}

	@Before
    public void startMailServer()
        throws Exception
    {
        greenMail = new GreenMail( ServerSetup.SMTP );
        //預設和屬性檔案中的使用者名稱和密碼相同,如果配置檔案中配置後這裡也可以不進行設定。
        greenMail.setUser( "[email protected]", "xxxxxx" );
        greenMail.start();
    }

    @Test
    public void testSendMail()
        throws Exception
    {
        ApplicationContext ctx = new ClassPathXmlApplicationContext( "account-email.xml" );
        AccountEmailService accountEmailService = (AccountEmailService) ctx.getBean( "accountEmailServiceImpl" );

        String subject = "Maven測試郵件";
        String htmlText = "<h3>我們累了</h3>";
        
        accountEmailService.sendMail( "[email protected]", subject, htmlText );

        greenMail.waitForIncomingEmail(2000, 1);
        
//        Message[] msgs = greenMail.getReceivedMessages();
//        System.out.println(greenMail.getReceivedMessages().length);
//        assertEquals(1, msgs.length );
//        assertEquals( subject, msgs[0].getSubject() );
//        assertEquals( htmlText, GreenMailUtil.getBody( msgs[0] ).trim() );
    }

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

在測試程式碼中註釋掉的部分greenMail.getReceivedMessages();,此處我未測試成功,每次獲得長度都是0,不知為何,還請大家指教。

到此為止一個簡單的Maven示例就算完成了,可以正常的傳送郵件,建議在學習Maven和Ant對應起來學習。

相關推薦

Maven座標依賴介紹傳送郵件示例專案

什麼是座標? 最早聽到座標是在數學幾何中,比如在一個平面座標系中(X、Y),表示該平面上與X軸的距離為Y,與Y軸的距離為X的一點, 任何一個座標都能夠唯一標識該平面中的一點。在實際生活中,比如說網上購物,你在下訂單的時候寫上家庭住址,然後快遞員 就能夠根據地址送貨上門,其實

程式碼珍藏傳送郵件

/** * 傳送重置密碼郵件 * @return */ @RequestMapping(params="sendResetPwdMail") @ResponseBody public AjaxJson sendResetPwdMail(String email,HttpServletRequest reque

monkeyrunner入門傳送郵件(四)

這裡我已Gmail為例,道理都是一樣的 device.touch裡面的數字是手機螢幕的座標,手機螢幕的座標這樣得知: 開啟設定–系統—開發者選項–指標座標 device.type模擬鍵盤輸入內容 提供可複製程式碼: #coding:utf-8 #儲存檔案格式記得選擇utf-8

Nodejs傳送郵件nodemailer

nodejs郵件模組nodemailer的使用說明 1.介紹      nodemailer是node的一個傳送郵件的元件,其功能相當強大,普通郵件,傳送附件,郵件加密等等都能實現,而且操作也十分方便。 nodemailer在GitHub上的專案地

Jenkins持續整合傳送郵件

最近專案中需要實現Jenkins上構建完成後自動傳送郵件,在網上搜了一些資料,多多少少有些問題,現在把自己的經驗分享一下。 大概步驟:系統管理—>系統設定—>郵件通知 點選高階,下面

Django專案傳送郵件

傳送郵件配置資訊 Django中內建了郵件傳送功能,被定義在django.core.mail模組中。傳送郵件需要使用SMTP伺服器,常用的免費伺服器有:163、126、QQ,下面以163郵件為例。 1)登入後設置-POP3/SMTP/IMAP。 2)在新頁面中點

用java開發Email工具傳送郵件

  作者:馮睿 本文介紹瞭如何利用Java的網路API來實現一個電子郵件工具程式。通常Email工具都是使用SMTP(簡單郵件傳輸協議, Simple Mail Transfer Protocol)來傳送郵件,使用POP3協議來接受電子郵件。在本文中只對這兩個協議作簡單介紹。

Web應用安全傳送郵件

To為收件人,Subject為標題,From為發件人地址。郵件頭注入的主要原因與HTTP訊息頭注入漏洞類似。訊息頭中各欄位以換行符分開,因此,如果能夠在外界傳入的引數插入換行符,那麼就可以新增新的訊息頭

利用JavaMail傳送郵件示例

    最近閒來無事,為了鞏固一下知識點,寫了一個利用JavaMail傳送郵件的例子。只寫了一個傳送的例子,以後有時間再寫下接收的例子。 1、簡單介紹一下JavaMail的傳送步驟 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session會話 通過session會話

Java mail傳送郵件示例

package com.zhangxueliang.demo; import java.util.*; import javax.mail.*; import javax.mail.Message.R

maven pom新增依賴,但是jar無法加入專案

今天在開發新專案的時候,需要引用其他子專案,於是將引用的子專案打包成jar,但是專案中一直無法引入相應的子專案jar。 最後解決方法(eclipse下): 1、project->右擊->Maven->Update Project,如此便可解決(我只操作

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

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

Maven學習(二):屬性座標依賴

前言: 1、pom檔案的配置,主要內容為屬性、座標與依賴、外掛、倉庫以及其他一些配置。 2、理解這些配置的內容,在一定程度上也就理解了Maven 的使用。 一、屬性 (一)Maven內建屬性: 1、${basedir} 專案根目錄,即包含 pom.xml 的目錄。 2、${v

Jenkins+maven+git 實現自動構建許可權管理靜態程式碼檢測遠端部署傳送郵件功能

Jenkins配置 1. 使用者許可權設定 配置->Configure Global Security (注:想讓匿名使用者可以瀏覽jenkins網站 需勾選Overall 中的read 和 Job

maven插件介紹maven-jar-plugin

content letter post end version class pid 技術交流 cut maven-jar-plugin 插件的maven依賴為: <dependency> <groupId>org.apache.maven

170525解決maven隱式依賴包版本問題

想想 是我 依賴包 cnblogs 可能 com sca dubbo ron 今天在使用dubbo2.5.3版本的時候,啟動項目的時候發現一個問題,tomcat啟動一直報錯 Caused by: java.lang.IllegalStateException: Contex

自動化運維工具SaltStack-1SaltStack介紹及安裝

自動生成 模塊 模糊匹配 mini 說明 pac roc redhat 通信 1、SaltStack簡介 官方網址:http://www.saltstack.com官方文檔:http://docs.saltstack.comGitHub:https:github.com/s

Java註解RetentionDocumentedTarget介紹

javadoc 聲明 示例 class 文件 con dash tor 描述 先看代碼,後面一個個來解析: @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, Elemen

python—day58 Django介紹 模板補充路由

自定義filter 函數 自定義 pan 介紹 tro Go ... 定義 Filter:   1.內置: filter     1.{{ value|date:‘Y-m-d H:i:s‘ }}     2. ...   2.自定義filter     1.在app新建一個

Maven座標依賴

(尊重勞動成果,轉載請註明出處:https://blog.csdn.net/qq_25827845/article/details/83628045冷血之心的部落格) 快速導航: Maven基礎概念和安裝配置教程 Maven的倉庫和settings.xml配置檔案 Maven的座