什么是Maven项目的骨架?
我们遵循Maven项目的以下约定:
1、在根目录放置pom.xml
2、在src/main/java目录放置项目的主代码
3、在src/test/java中放置项目测试代码
我们称这些基本目录结构和pom.xml文件内容称为项目的骨架
如何使用maven archetype创建项目的骨架?
如果是Maven 3,mvn archetype:generate
如果是Maven 2,mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate
注:在资料会让你直接使用更为简单的mvn archetype:generate命令,但在Maven 2中这是不安全的,因为该命令没有指定Archetype插件的版本,于是Maven会自动去下载最新的版本,进而可能得到不稳定的SNAPSHOT版本,导致运行失败。然而在Maven3中,即使用户没有指定版本,Maven也只会解析最新的稳定版本,因此这是安全的
简单解释mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate命令
执行这条命令其实是在运行插件maven-archetype-plugin,注意冒号间隔
其格式是groupId:artifactId:version:goal
org.apache.maven.plugins是maven官方插件的groupId
maven-archetype-plugin是Archetype插件的artifactId
2.0-alpha-5是目前该插件最新的稳点版本
generate是要使用的插件目标
作为一个用户,注册账户的时候往往需要做以下事情:
1、一个未被使用过的账号ID
2、一个未被使用的email地址
3、一个任意的显示名称
4、设置安全密码,并重复输入以确认
5、输入验证码
6、前往邮箱查收激活连接并单击激活账号
8、登录
为什么需要上面那些操作?
1、使用账户ID和Email用来唯一地标识某个账户
2、使用名称显示在页面上,方便浏览
3、输入两次密码,以确保没有输错
系统需要检查ID和Email的唯一性,验证两次输入的密码是否一致
4、验证码是由系统随机生成的只能由肉眼识别器内容的图片,可以有效防止机器恶意批量注册,若输入正确的验证码信息,系统则会进行检查,如果验证码错误,系统会生成并返回新的验证码
5、一旦所有检查都没有问题,系统就会生成一个激活链接,并发送到用户的邮箱中,单击激活链接后,账户就被激活了,注册就完成了,用户就可以登录了
如果考虑到一些安全的因素?
比如说,服务器端密文地保存密码,检查密码的强弱程度,更进一步则需要考虑验证码的失效时间,激活链接的失效时间,等等
Maven的坐标(Coordinate)
Maven定义了这样一组规则,世界上任何一个构件都可以使用Maven坐标唯一标识
Maven的坐标的元素包括groupId、artifactId、version、packaging、classifier
比如,需要使用Java5平台上的TestNG的5.8版本,就告诉Maven : "groupId=org.testing; artifactId=testing; version=5.8; classifier=jdk15"
Maven内置了一个中央仓库的地址(http://repol.maven.org/maven2),该中央长湖包含了世界上大部分流行的开源项目构件,Maven会在需要的时候去那里下载
关于Maven坐标命名的一些建议
1、一个公司往往会有很多项目,groupId不应该对应项目隶属的组织或公司,即groupId不要只定义在组织级别 比如 org.apache 不要这样,要这样org.apache.hadoop,定义到实际项目名
2、arifactId为实际相中的一个Maven模块,命名规则一般为:使用实际项目名前缀,便于查找
3、version版本,以后再说
4、packaging元素定义Maven项目的打包方式,jar、war等,打包方式会影响构建的声明周期不指定packing时,默认是jar
5、classifier元素用来定义构建输出的一些附属构件,附属构件与主构件对应,
什么是附属构件与主构件?
比如nexus-indexer-2.0.0.jar是主构件,该项目可能还会通过使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar这样一些附属构件,其包含了Java文档和源码。这时候javadoc和sources就是这两个附属构件的classifier。这样附属构建也就拥有了自己唯一的坐标。
注意,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的
groupId、artifactId、version、packaging、classifier如何定义
groupId、artifactId、version是必须定义的
packaging是可选的(默认为jar)
classifier是不能直接定义的
packing的定义一定与构件扩展名对应吗?
不一定,比如packaging为maven-plugin的构件扩展名为jar
Maven仓库的布局是什么意思?
Maven仓库的布局也是基于Maven的坐标,后面会说
案例account-email
案例中有一个email模块负责发送账户激活的电子邮件
包括:POM配置、主代码和测试代码以及Spring配置
GreenMail是什么?
GreenMail是开源的邮件服务测试套件,account-email模块使用该套件来测试邮件的发送
关于GreenMail的详细信息可访问http://www.icegreen.com/greenmail/
一个依赖声明可以包含如下元素
<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclustion>
...
</exclustion>
...
</exclusions>
</dependency>
...
</dependencies>
...
</project>
project元素?
包含一个dependencies
dependencies元素?
包含多个dependency元素,以声明一个或多个项目的依赖
每个dependency元素,可以包含的元素有?
1、groupId、artifactId和version,依赖的基本坐标,Maven根据坐标才能找到需要的依赖
2、type,依赖的类型,对应于项目坐标定义的packaging,大部分情况下,该元素不必声明,默认为jar
3、scope,依赖的范围
4、optional,标记依赖是否可选
5、exclusions:用来排除传递性依赖