(二)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
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 安全組
版本管理(二)之Git和GitHub的連接和使用
ext 郵箱地址 github 遠程倉庫 編輯器 version it 管理 png 記錄 首先需要註冊登錄GitHub:https://github.com 然後 ①:下載Git 先從Git官網,由於我的系統是64位的所以選擇64-bit Git for Wi
Kafka(二)Kafka生產者和消費者模型
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開發學習心得(二):Mybatis和Url路由
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中的共享鎖與排他鎖。我習慣在描述表鎖的時候按照讀寫來區分,在表