- 浏览: 701479 次
- 性别:
- 来自: 北京
博客专栏
-
读金庸故事,品程序人生
浏览量:47681
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
1. 项目需求
加入我们现在有这样一个小小项目,就是做一个注册模块,让注册的人员记录可以插入到数据库中,还可以做账号的唯一性判断,注册成功后可以进行邮件提醒功能。书上功能很简单,其实重点不是功能,而是借由此示例说明Maven的特性。这一节咱们主要说明一下坐标与依赖的特性。其余的特性也皆由此案例中衍生出来。
2. 模块划分
基本模块功能分为
验证码生成:包括生成随即验证数字以及数字图片。
发送邮件:注册成功后需要给注册的Email发一封email,以便激活注册信息。
激活账户:用于邮件激活用户之后,用户才可用。
登录:一切成功后可以登录系统。
系统比较简单了,但是我们也分模块进行开发。也好体现Maven模块强解耦合的管理思想。
3. 邮件模块的实现
这里和书中的讲解顺序不太一样,我们先来开发功能模块,之后通过Maven的坐标和以来的概念来分析咱们的邮件模块。整个系统是B/S架构,采用Spring帮助我们进行类的管理。为了放大这个微型系统的规模,我们单独为这个邮件功能建立一个项目,模拟一个很大系统的一个模块。我们先看邮件模块的实现类吧,接口就不给出了
之后在包/src/test/java编写测试用例
单元测试也写完了,之后就是项目构建、打包了。 在这之前我们来看看Spring配置文件的内容
mail.properties内容
下面就需要Maven出场了。 4. Maven的介入 其实上面的程序打包已经按照了Maven的规约了~我们再来看看这个项目模块的代码结构 通过MyEclipse插件很快写出pom.xml文件内容
运行一下命令。
自己的邮箱看看效果,多了一封邮件。Ok,再看本地仓库,唉~~~自己的c盘又添了不少东西。本地仓库会越来越大的。各位使用者要有心理准备,当然可以通过配置的方式转移本地仓库存储位置。 实际上是通过这个小例子说明坐标这个概念。在Maven中的坐标的意思就是各种构建引入的秩序,坐标是多维的。也就是groupId、artifactId、version、packaging这几个元素决定了其组建的唯一标识(classifier没有看到,如果后面看到了再补充进来)。 前面也稍带提过了groupId是项目组的标识、artifactId是模块标识、version是版本号标识、packaging是打包方式,默认是jar方式。如此看来这些元素描述了一个不能重复的标识,groupId+ artifactId+ version+”.”+packaging在整个儿仓库中是不应该重复的。
而其他项目需要你的模块为其服务的时候,也是根据坐标找到你的模块的。这就引出了下面依赖项的配置。这个模块依赖了Spring,不怕,我们从maven仓库中去取依赖就可以了,下面的问题就是:我们需要哪些依赖?这些依赖的版本是什么? 通过已有组件的坐标,我们可以轻易从Maven中心库中获取依赖包
描述我们这个邮件模块依赖org.springframework.spring-context-support.2.5.6.jar这个东东。果然,运行后在本地仓库中找到了 项目依赖可以有以下几种配置范围 1:compile:默认值,这个代表在Maven项目周期的编译、测试、运行的3个classpath都生效,也就是说Maven自己在项目不同生命周期使用的classpath不一样,一旦配置了compile,那么在以上三个周期会将依赖jar放到不同周期classpath中。 2:test:测试期间有效,运行期间不必引入,就像junit包,在运行期间就没必要引入了。 3:provided:在编译、测试期间有效,其余周期都没用到,比如servlet-api.jar,web容器提供了此规范apijar和实现。 4:runtime:只在运行、测试期间生效,以JDK的JDBC规范为代表,哦,还有JavaEE的JPA规范。 5:system:与本机系统环境绑定,在编译、测试期间有效,往往和本机环境绑定,移植性不太好。 依赖传播:单丝不成线,孤木不成林。一个项目需要依赖很多辅助包,我们的spring也不例外。下面是本项目的依赖关系图
咱们就拿spring-core来说事儿吧,本项目直接依赖于它,它呢也不是吃素的,也需要别人的支持,他需要apache的commons-logging。那么就导致了如果我们想要使用spring-core的功能,必须得引入这个commons-logging包喽。没有Maven之前,我们一般都是先引入我们直接需要的包,之后根据错误信息加上我们自身的开发经验一个一个去网上下载我们核心包需要的其他包。造成的结果是,花了大量的时间在网上找包,好不容易将项目run起来了,执行一个操作后,又发现在运行的时候还需要别的jar包,如此根据错误信息往复在网上找相关jar包。最后发现自己一个很简单的项目怎么引入了那么多的包啊! 使用Maven管理项目的话,它会自动为您找这种传递性的依赖,因为在Maven中心仓库的项目描述中都已经严格阐述了各个开源项目的依赖关系。诚然,这种传递性依赖也存在范围的问题。我们就拿上面的举例子,本发送邮件模块项目依赖于spring-core依赖范围是compile,而spring-core依赖于commons-logging也是compile范围。那么通过传递性,本项目对commons-logging的依赖也是compile。看下表
直接依赖范围 compile test provided runtime compile compile - - runtime test test - - test provided provide - provided provided runtime runtime - - runtime 这个表是嘛意思呢?就是说一个项目的第一直接依赖假如是compile范围,那么它的第二依赖包如果也是compile,那么本项目和第二依赖包的依赖范围就是compile。如果一个项目的第一直接依赖假如是compile范围,那么它的第二依赖包如果是test,那么本项目和第二依赖包不存在任何依赖关系,也是,第一直接依赖包和第二依赖包是测试的时候才用到的。无需影响到其他使用者。package com.liuyan.account.mail.impl;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import com.liuyan.account.mail.AccountEmailService;
public class AccountEmailServiceImpl implements AccountEmailService {
private JavaMailSender javaMailSender;
public JavaMailSender getJavaMailSender() {
return javaMailSender;
}
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
private String systemEmail;
public String getSystemEmail() {
return systemEmail;
}
public void setSystemEmail(String systemEmail) {
this.systemEmail = systemEmail;
}
@Override
public void sendMail(String to, String subject, String message)
throws MessagingException {
MimeMessage msg = javaMailSender.createMimeMessage();
MimeMessageHelper msgHelper = new MimeMessageHelper(msg);
msgHelper.setFrom(systemEmail);
msgHelper.setTo(to);
msgHelper.setSubject(subject);
msgHelper.setText(message);
javaMailSender.send(msg);
}
}
package com.liuyan.account.mail;
import javax.mail.MessagingException;
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.ServerSetup;
public class AccountEmailServiceTest {
private GreenMail greenMail;
@Before
public void startTest() {
greenMail = new GreenMail(ServerSetup.SMTP);
greenMail.setUser("suhuanzheng7784877@163.com", "1111");
greenMail.start();
}
@Test
public void sendMail() throws MessagingException {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
AccountEmailService accountEmailService = (AccountEmailService) ctx
.getBean("accountEmailService");
String to = "suhuanzheng7784877@163.com";
String subject = "测试";
String message = "内容";
accountEmailService.sendMail(to, subject, message);
}
@After
public void stop() {
greenMail.stop();
}
}
<?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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p">
<!-- 加载Properties文件 -->
<bean id="configurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:mail.properties</value>
</list>
</property>
</bean>
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="defaultEncoding" value="UTF-8" />
<property name="host" value="${mail.host}" />
<property name="username" value="${mail.username}" />
<property name="password" value="${mail.password}" />
<property name="javaMailProperties">
<props>
<!-- 设置认证开关 -->
<prop key="mail.smtp.auth">true</prop>
<!-- 启动调试开关 -->
<prop key="mail.debug">true</prop>
</props>
</property>
</bean>
<bean id="accountEmailService" class="com.liuyan.account.mail.impl.AccountEmailServiceImpl">
<property name="javaMailSender" ref="javaMailSender"></property>
<property name="systemEmail" value="suhuanzheng7784877@163.com"></property>
</bean>
</beans>
mail.host=smtp.163.com
mail.username=suhuanzheng7784877@163.com
mail.password=111111
mail.from=suhuanzheng7784877@163.com
mail.to=suhuanzheng7784877@163.com
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liuyan.account</groupId>
<artifactId>MavenAccount-email</artifactId>
<version>0.0.1-SNAPSHOT</version>
<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>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>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resource</directory>
</resource>
</resources>
</build>
</project>
mvn clean test
<groupId>com.liuyan.account</groupId>
<artifactId>MavenAccount-email</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>2.5.6</version>
</dependency>
发表评论
-
Memcache工作原理总结
2014-03-07 10:22 17039<!--[if !supportLists]-- ... -
Maven3实战笔记16Maven总结
2011-06-27 09:54 27111. 前言 用了15篇Blog做Maven3的学习笔记,最 ... -
Maven3实战笔记15编写Maven插件
2011-06-24 08:52 66741. 自定义插件介绍 在 ... -
Maven3实战笔记14Maven生成项目站点
2011-06-23 08:52 71631. 前言 一个项目的成败离不开项目各个阶段的信息反馈,总 ... -
Maven3实战笔记13Maven Profile定制化构建
2011-06-22 08:39 120551. 前言 有时候我们开发的软件有不同的环境,开发阶段是开 ... -
Maven3实战笔记11Maven集成Hudson进行持续集成
2011-06-14 09:08 3396唉~~~因为这篇文章篇幅比较大,blog实在不能写得全,因此将 ... -
Maven3实战笔记11Maven集成Hudson进行持续集成1----Hudson环境配置
2011-06-13 16:18 74641. 持续集成 持续集成其实是由敏捷开发这个概念衍生出来 ... -
Maven3实战笔记10使用Maven进行测试
2011-06-13 09:16 51131. 测试简介 这里所说 ... -
使用Google工具生成随机验证码
2011-06-11 12:26 10749很多网站都有验证码认证的功能。生成随机数,需要用户自己填写,之 ... -
Maven3实战笔记09Maven的私服-Nexus常用功能
2011-06-09 09:06 83591. 前言 其实介绍Maven私服的资料已经很多了,《Ma ... -
Maven3实战笔记08Maven反应堆
2011-06-08 09:03 22971. 反应堆 反应堆这个名字听上去挺专业,其实就是多个模块 ... -
Maven3实战笔记07继承
2011-06-08 09:01 22051. 继承 之前我们学习Maven的聚合机制遗留个问题,就 ... -
Maven3实战笔记06聚合
2011-06-07 09:07 20331. Maven聚合的 ... -
Maven3实战笔记04Maven的生命周期和插件
2011-06-03 09:15 40471. Maven的生命周期 Maven的生命周期其实是指它 ... -
Maven3实战笔记03Maven仓库
2011-06-03 09:11 33831. 仓库的概念 大家可能注意到了,在基于Maven管理的 ... -
Maven3实战笔记02坐标和依赖--2
2011-06-02 09:34 23565. 依赖调节 假如现在 ... -
Maven3实战笔记01环境配置与使用入门
2011-06-01 10:00 110501. 前言 Maven是apache的一个顶级项目,它的出 ...
相关推荐
总之,Maven3实战笔记(整合)不仅涵盖了Maven的基本原理和核心功能,还深入探讨了如何将Maven应用于实际项目中,解决常见的构建问题,提高构建效率和项目质量。对于Java开发者而言,熟练掌握Maven的使用技巧,将大大...
【标题】:“maven笔记:maven-overlay-实战笔记” 在 Maven 的世界里,"overlay" 是一个重要的概念,主要用于Web项目的构建和部署。Maven overlay 技术允许你将多个项目的输出“重叠”在一起,形成一个新的项目,...
《Maven3实战笔记(全)》是一本全面深入介绍Maven3的实践指南,由一位具有独特风格的作者撰写,以其风趣幽默的方式解析了Maven3的各种核心概念和使用技巧。这本书涵盖了从Maven的基础安装与配置,到复杂的仓库依赖...
### Maven3实战笔记02:项目需求和模块分析 在Maven3的实战学习中,第二部分着重于项目需求分析与模块划分,这是构建大型、复杂项目时的基础工作,能够帮助开发者更好地理解项目架构,合理分配资源,提高开发效率。...
总的来说,"Maven入门实战笔记02-基础(2)"很可能是对Maven基础操作的深入讲解,涵盖了项目创建、POM配置、依赖管理、生命周期和构建过程等内容,对于想要学习和掌握Maven的Java开发者来说,是一份非常实用的学习资料...
但是,我们可以根据标题和描述以及通用的Maven知识点,来构建一篇关于Maven3的实战笔记整合文章。 ### Maven3实战笔记整合 #### Maven简介 Apache Maven是一个项目管理和自动化构建的工具,主要服务于Java平台的...
通过本篇实战笔记,我们了解了Maven如何处理依赖和插件。依赖解析确保了项目能够正确获取所需的所有库文件,而插件解析则自动化了构建过程中的任务。这两种机制共同作用,使得Maven能够成为一个强大的构建工具。 1....
标题中提及的“Maven3实战笔记”指向了Maven这款流行的Java项目管理和自动化构建工具的第三个主要版本。Maven自从引入以来,就极大地简化了Java项目的构建过程,提高了项目构建的标准化程度。它使用项目对象模型...
3. **compile**:执行Default生命周期中的`compile`阶段,调用`maven-compiler-plugin`的`compile`目标来编译源代码。 4. **test**:执行Default生命周期中的`test`阶段,调用`maven-surefire-plugin`的`test`目标来...
`maven-compiler-plugin-3.8.0-source-release` 版本是 Maven 编译插件的一个特定版本,该版本包含了对 Maven 3.x 系列的支持。这个插件的主要任务包括: 1. **源代码编译**:默认使用 JDK 的 `javac` 编译器进行 ...
### Maven3实战笔记08——Maven反应堆:深度解析与实战应用 #### Maven反应堆的概念与作用 在深入探讨Maven反应堆之前,我们首先需要理解Maven项目是如何组织和构建的。Maven是一种自动化构建工具,它通过定义项目...
课程目录: Maven3_01_maven概览 Maven3_02_maven安装的注意事项 Maven3_03_在eclipse中建立简单的项目 Maven3_04_maven的依赖特性 Maven3_05_maven的聚合和继承 Maven3_06_复习maven的基本...Maven3实战笔记 Maven配置
【Maven3实战笔记】 Maven3是一款强大的Java项目管理和集成工具,由Apache软件基金会开发。它通过提供一套标准化的构建、依赖管理和项目信息管理的方式来简化项目的生命周期。本实战笔记将深入探讨Maven3的核心概念...
- **插件**: Maven的扩展性主要体现在插件上,如`maven-compiler-plugin`用于编译Java代码,`maven-surefire-plugin`用于执行单元测试。 - **版本控制**: Maven遵循严格的版本号规则,例如`1.0.0-SNAPSHOT`表示开发...
Maven的核心概念之一是仓库(Repository),仓库用于存储项目依赖的jar包、插件和其他资源。本文将深入探讨Maven仓库的相关知识,包括其分类、作用以及如何配置和使用。 #### 1. Maven仓库分类 Maven仓库主要分为...
《Maven3实战》这本书是Java开发者不可或缺的参考资料,它深入浅出地介绍了Maven这一强大的项目管理和构建工具。在Java开发中,Maven3以其规范化的项目结构、自动化构建和依赖管理等功能,极大地提高了开发效率和...