什么是坐标?
最早听到坐标是在数学几何中,比如在一个平面坐标系中(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.username=xxxxx@qq.com
#邮件账户密码
email.password=xxxxxx
#邮件内容编码,防止发送中文出现乱码
email.defaultEncoding=UTF-8
#是否需要认证
email.auth=true
#邮件发送地址,一般和邮件账户名相同
email.systemEmail=xxxxx@qq.com
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( "xxxxx@qq.com", "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( "yyyy@msn.com", 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示例就算完成了,可以正常的发送邮件,建议在学习Maven和Ant对应起来学习。