`
suhuanzheng7784877
  • 浏览: 704382 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47751
社区版块
存档分类
最新评论

Maven3实战笔记02坐标和依赖--1

阅读更多

1.  项目需求

加入我们现在有这样一个小小项目,就是做一个注册模块,让注册的人员记录可以插入到数据库中,还可以做账号的唯一性判断,注册成功后可以进行邮件提醒功能。书上功能很简单,其实重点不是功能,而是借由此示例说明Maven的特性。这一节咱们主要说明一下坐标与依赖的特性。其余的特性也皆由此案例中衍生出来。

2.  模块划分

基本模块功能分为

验证码生成:包括生成随即验证数字以及数字图片。

发送邮件:注册成功后需要给注册的Email发一封email,以便激活注册信息。

激活账户:用于邮件激活用户之后,用户才可用。

登录:一切成功后可以登录系统。

系统比较简单了,但是我们也分模块进行开发。也好体现Maven模块强解耦合的管理思想。

3.  邮件模块的实现

这里和书中的讲解顺序不太一样,我们先来开发功能模块,之后通过Maven的坐标和以来的概念来分析咱们的邮件模块。整个系统是B/S架构,采用Spring帮助我们进行类的管理。为了放大这个微型系统的规模,我们单独为这个邮件功能建立一个项目,模拟一个很大系统的一个模块。我们先看邮件模块的实现类吧,接口就不给出了

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);

	}

}

 之后在包/src/test/java编写测试用例

 

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();
	}

}

 单元测试也写完了,之后就是项目构建、打包了。

在这之前我们来看看Spring配置文件的内容

<?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.properties内容

mail.host=smtp.163.com
mail.username=suhuanzheng7784877@163.com
mail.password=111111
mail.from=suhuanzheng7784877@163.com
mail.to=suhuanzheng7784877@163.com

 下面就需要Maven出场了。

4.  Maven的介入

其实上面的程序打包已经按照了Maven的规约了~我们再来看看这个项目模块的代码结构

 

通过MyEclipse插件很快写出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/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

 自己的邮箱看看效果,多了一封邮件。Ok,再看本地仓库,唉~~~自己的c盘又添了不少东西。本地仓库会越来越大的。各位使用者要有心理准备,当然可以通过配置的方式转移本地仓库存储位置。

实际上是通过这个小例子说明坐标这个概念。在Maven中的坐标的意思就是各种构建引入的秩序,坐标是多维的。也就是groupIdartifactIdversionpackaging这几个元素决定了其组建的唯一标识(classifier没有看到,如果后面看到了再补充进来)。

前面也稍带提过了groupId是项目组的标识、artifactId是模块标识、version是版本号标识、packaging是打包方式,默认是jar方式。如此看来这些元素描述了一个不能重复的标识,groupId+ artifactId+ version+.+packaging在整个儿仓库中是不应该重复的。

	<groupId>com.liuyan.account</groupId>
	<artifactId>MavenAccount-email</artifactId>
	<version>0.0.1-SNAPSHOT</version>

 而其他项目需要你的模块为其服务的时候,也是根据坐标找到你的模块的。这就引出了下面依赖项的配置。这个模块依赖了Spring,不怕,我们从maven仓库中去取依赖就可以了,下面的问题就是:我们需要哪些依赖?这些依赖的版本是什么?

通过已有组件的坐标,我们可以轻易从Maven中心库中获取依赖包

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>2.5.6</version>
		</dependency>

 描述我们这个邮件模块依赖org.springframework.spring-context-support.2.5.6.jar这个东东。果然,运行后在本地仓库中找到了

 

项目依赖可以有以下几种配置范围

1compile:默认值,这个代表在Maven项目周期的编译、测试、运行的3classpath都生效,也就是说Maven自己在项目不同生命周期使用的classpath不一样,一旦配置了compile,那么在以上三个周期会将依赖jar放到不同周期classpath中。

2test:测试期间有效,运行期间不必引入,就像junit包,在运行期间就没必要引入了。

3provided:在编译、测试期间有效,其余周期都没用到,比如servlet-api.jarweb容器提供了此规范apijar和实现。

4runtime:只在运行、测试期间生效,以JDKJDBC规范为代表,哦,还有JavaEEJPA规范。

5system:与本机系统环境绑定,在编译、测试期间有效,往往和本机环境绑定,移植性不太好。

依赖传播:单丝不成线,孤木不成林。一个项目需要依赖很多辅助包,我们的spring也不例外。下面是本项目的依赖关系图

 

咱们就拿spring-core来说事儿吧,本项目直接依赖于它,它呢也不是吃素的,也需要别人的支持,他需要apachecommons-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,那么本项目和第二依赖包不存在任何依赖关系,也是,第一直接依赖包和第二依赖包是测试的时候才用到的。无需影响到其他使用者。

  • 大小: 39.7 KB
  • 大小: 73.8 KB
  • 大小: 91.8 KB
4
2
分享到:
评论
1 楼 viei 2011-11-17  
依赖关系图是自己画的还是工具生成的呢?

相关推荐

    Maven3实战笔记(整合)

    总之,Maven3实战笔记(整合)不仅涵盖了Maven的基本原理和核心功能,还深入探讨了如何将Maven应用于实际项目中,解决常见的构建问题,提高构建效率和项目质量。对于Java开发者而言,熟练掌握Maven的使用技巧,将大大...

    maven笔记:maven-overlay-实战笔记

    【标题】:“maven笔记:maven-overlay-实战笔记” 在 Maven 的世界里,"overlay" 是一个重要的概念,主要用于Web项目的构建和部署。Maven overlay 技术允许你将多个项目的输出“重叠”在一起,形成一个新的项目,...

    Maven3实战笔记(全)

    《Maven3实战笔记(全)》是一本全面深入介绍Maven3的实践指南,由一位具有独特风格的作者撰写,以其风趣幽默的方式解析了Maven3的各种核心概念和使用技巧。这本书涵盖了从Maven的基础安装与配置,到复杂的仓库依赖...

    Maven3实战笔记02项目需求和模块分析

    ### Maven3实战笔记02:项目需求和模块分析 在Maven3的实战学习中,第二部分着重于项目需求分析与模块划分,这是构建大型、复杂项目时的基础工作,能够帮助开发者更好地理解项目架构,合理分配资源,提高开发效率。...

    Maven入门实战笔记02-基础(2)

    总的来说,"Maven入门实战笔记02-基础(2)"很可能是对Maven基础操作的深入讲解,涵盖了项目创建、POM配置、依赖管理、生命周期和构建过程等内容,对于想要学习和掌握Maven的Java开发者来说,是一份非常实用的学习资料...

    Maven3实战笔记整合

    但是,我们可以根据标题和描述以及通用的Maven知识点,来构建一篇关于Maven3的实战笔记整合文章。 ### Maven3实战笔记整合 #### Maven简介 Apache Maven是一个项目管理和自动化构建的工具,主要服务于Java平台的...

    Maven3实战笔记05仓库依赖解析与插件解析

    通过本篇实战笔记,我们了解了Maven如何处理依赖和插件。依赖解析确保了项目能够正确获取所需的所有库文件,而插件解析则自动化了构建过程中的任务。这两种机制共同作用,使得Maven能够成为一个强大的构建工具。 1....

    Maven3实战笔记.pdf

    标题中提及的“Maven3实战笔记”指向了Maven这款流行的Java项目管理和自动化构建工具的第三个主要版本。Maven自从引入以来,就极大地简化了Java项目的构建过程,提高了项目构建的标准化程度。它使用项目对象模型...

    Maven3实战笔记04Maven的生命周期和插件

    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-compiler-plugin-3.8.0-source-release` 版本是 Maven 编译插件的一个特定版本,该版本包含了对 Maven 3.x 系列的支持。这个插件的主要任务包括: 1. **源代码编译**:默认使用 JDK 的 `javac` 编译器进行 ...

    Maven3实战笔记08Maven反应堆

    ### Maven3实战笔记08——Maven反应堆:深度解析与实战应用 #### Maven反应堆的概念与作用 在深入探讨Maven反应堆之前,我们首先需要理解Maven项目是如何组织和构建的。Maven是一种自动化构建工具,它通过定义项目...

    Maven3实战视频教程(14集)

    课程目录: Maven3_01_maven概览 Maven3_02_maven安装的注意事项 Maven3_03_在eclipse中建立简单的项目 Maven3_04_maven的依赖特性 Maven3_05_maven的聚合和继承 Maven3_06_复习maven的基本...Maven3实战笔记 Maven配置

    Maven3实战笔记

    【Maven3实战笔记】 Maven3是一款强大的Java项目管理和集成工具,由Apache软件基金会开发。它通过提供一套标准化的构建、依赖管理和项目信息管理的方式来简化项目的生命周期。本实战笔记将深入探讨Maven3的核心概念...

    Maven3实战笔记03Maven仓库

    Maven的核心概念之一是仓库(Repository),仓库用于存储项目依赖的jar包、插件和其他资源。本文将深入探讨Maven仓库的相关知识,包括其分类、作用以及如何配置和使用。 #### 1. Maven仓库分类 Maven仓库主要分为...

    Maven3实战.zip

    《Maven3实战》这本书是Java开发者不可或缺的参考资料,它深入浅出地介绍了Maven这一强大的项目管理和构建工具。在Java开发中,Maven3以其规范化的项目结构、自动化构建和依赖管理等功能,极大地提高了开发效率和...

    最新Maven-apache-maven-3.8.1-Repository-配置好的

    - **插件**: Maven的扩展性主要体现在插件上,如`maven-compiler-plugin`用于编译Java代码,`maven-surefire-plugin`用于执行单元测试。 - **版本控制**: Maven遵循严格的版本号规则,例如`1.0.0-SNAPSHOT`表示开发...

Global site tag (gtag.js) - Google Analytics