初探Maven3

这里演示的是Maven3最基本的使用


首先看一下Maven3的基本知识

/**
 * @see ================================================================================================================================
 * @see 安装Maven3
 * @see 1、解压缩到apache-maven-3.0.3-bin.zip到硬盘目录中,比如D:\\Develop\\apache-maven-3.0.3\\
 * @see 2、设置环境变量M2_HOME=D:\Develop\apache-maven-3.0.3和Path=%M2_HOME%\bin;
 * @see 3、Win+R-->cmd-->mvn -v-->打印Apache Maven 3.0.3等信息即表示安装成功
 * @see ================================================================================================================================
 * @see 配置Maven3
 * @see 1、修改\\MAVEN_HOME\\conf\\settings.xml第53行<localRepository>D:/Develop/MyMaven</localRepository>
 * @see 2、上面的修改用于指定本地仓库目录,接下来将修改后的settings.xml拷贝到D:\\Develop\\MyMaven\\目录中
 * @see 3、定位到MyEclipse6.5.0GA-->Window-->Preferences-->MyEclipse Enterprise Workbench-->Maven4MyEclipse
 * @see 4、Maven4MyEclipse-->Installations-->Add-->选择至D:\\Develop\\apache-maven-3.0.3\\目录-->勾选之-->Apply
 * @see 5、Maven4MyEclipse-->User Settings File-->Browse-->D:\\Develop\\MyMaven\\settings.xml-->Refresh Settings
 * @see 6、Maven4MyEclipse-->Maven JDK-->要选择我们本机JDK。。并且取消勾选Download repository index updates on startup选项
 * @see ================================================================================================================================
 * @see 建立Maven工程
 * @see 1、MyEclipse6.5GA-->右键-->New-->Project-->Java Maven Project-->输入相关(这里可以随便输入,不要紧的)信息-->Finish
 * @see 2、接下来一个典型的Maven工程就创建后了,其核心就是pom.xml文件。。。。。。我们会在后面主要介绍POM文件的,在这之前先带领大家预热一番
 * @see ================================================================================================================================
 * @see 预热Maven
 * @see 1、通常习惯将源代码放置到/src/main/java/中......源代码的资源文件放置到/src/main/resources/中
 * @see    通常习惯测试代码放置到/src/test/java/中......测试代码资源文件放置到/src/test/resources/中
 * @see 2、mvn clean              -->运行清理操作。默认会清理target文件夹中的数据
 * @see    mvn clean compile      -->先运行清理,之后运行编译操作。默认会将代码编译到target文件夹中
 * @see    mvn clean test         -->运行清理和测试操作
 * @see    mvn clean package      -->运行清理和打包操作。包的名称就是项目模块名称加版本名称
 * @see    mvn clean install      -->运行清理和安装。所谓安装,就是将打好的包安装到本地仓库中,以便被其它项目调用
 * @see    mvn clean deploy       -->运行清理和发布。它会将其发布到私服上
 * @see    mvn archetype:generate -->Maven有一些固定的生成模式,其中使用该可以自动完成骨架的建立
 * @see 3、依赖包的查询
 * @see    1)所有的依赖都是通过坐标进行存储的(GAV--groupId,artifactId,version)
 * @see    2)有一些网上的仓库提供了坐标的查询(http://search.maven.org/或者http://mvnrepository.com/)
 * @see    3)maven搜索依赖包的顺序:本地仓库-->私服-->中央仓库
 * @see 4、版本管理(总版本号.分支版本号.小版本号-里程碑版本)
 * @see    总版本号:一般表示框架的变动。如Struts1和Struts2,jBPM3和jBPM4
 * @see    分支版本:一般表示增加了一些功能
 * @see    小版本号:一般表示在分支版本上的BUG修复
 * @see    里程碑版:SNAPSHOT-->Alpha-->Beta-->Release-->GA
 * @see            SNAPSHOT-->即快照版本,也就是开发中的版本,是最不安全的版本
 * @see               Alpha-->内部的测试版本
 * @see                Beta-->外部的公测版本
 * @see             Release-->已通过测试,并初步稳定,也叫RC版本
 * @see                  GA-->稳定版本,此时就可以投入市场了
 * @see ================================================================================================================================
 * @see Nexus的安装
 * @see 1)下载nexus-2.0.3-bundle.zip并解压缩(在其主页http://www.sonatype.org/点击'DOWNLOAD NEXUS'绿色大按钮)
 * @see 2)将该值%NEXUS_HOME%\bin加入环境变量(NEXUS_HOME=D:\\Develop\\nexus-2.0.3-bundle\\nexus-2.0.3)
 * @see 3)将nexus安装到windows的服务中(Win+R---cmd---nuxus install)
 * @see 4)修改%NEXUS_HOME%\bin\jsw\conf\wrapper.conf第15行为wrapper.java.command=D:\Develop\Java\jdk1.6.0_30\bin\java
 * @see 5)启动nexus服务(Win+R---cmd---nuxus start(出现'wrapper | nexus started.'表示启动成功))
 * @see   也可以在服务面板中启动nexus服务(Win+R---services.msc即可打开服务面板)
 * @see 6)使用admin@admin123登录http://127.0.0.1:8081/nexus(nexus默认发布在jetty中,且jetty默认端口为8081)
 * @see   nexus有两个版本,一个是war版本(即发布版本,可以发布到tomcat等web容器中),一个是zip版本(它自带了jetty服务器)
 * @see ================================================================================================================================
 * @see Nexus的仓库类型(由于Nexus提供可视化界面,故其用法略,大家随意点点就能明白大致用途)
 * @see virtual:针对Maven1.x的转接仓库,由于我们用的是Maven3.0.5,故该仓库对我们没啥用
 * @see  hosted:内部项目的发布仓库
 * @see          Releases仓库表示内部模块中release模块的发布仓库
 * @see          Snapshots仓库作用与Releases相同
 * @see          3rd party仓库表示第三方依赖的仓库,这个数据通常是由内部人员自行下载后发布上去的
 * @see   proxy:代理仓库。即从远程中央仓库中寻找数据的仓库
 * @see          Apache Snapshots仓库是从Apache网站寻找快照版本的仓库
 * @see          Central仓库即中央仓库,它访问的地址是在下面Configuration中Remote Storage Location值决定的
 * @see          Codehaus Snapshots仓库从Codehaus开源组织中寻找快照版本的仓库
 * @see   group:组仓库。用来方便开发人员进行设置的仓库
 * @see ================================================================================================================================
 * @see Nexus的索引更新
 * @see 1)下载http://repo1.maven.org/maven2/.index/nexus-maven-repository-index.zip
 * @see 2)停止nexus服务(在cmd窗口使用nexus stop或者在服务面板中右键stop nexux服务)
 * @see 3)删除%NEXUS_HOME%\sonatype-work\nexus\indexer\central-ctx\文件夹中的全部文件
 * @see 4)将nexus-maven-repository-index.zip解压后的文件放到%NEXUS_HOME%\sonatype-work\nexus\indexer\central-ctx\文件夹中
 * @see 5)重启nexus即自动更新索引
 * @see ================================================================================================================================
 */

下面,我们在MyEclipse6.5GA中新建一个Maven工程


首先是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">
	<!-- 当前POM模型的版本:目前其值只能是固定的4.0.0 -->
	<modelVersion>4.0.0</modelVersion>

	<!-- 这三个属性:groupId、artifactId、version称为项目的坐标 -->
	<!-- 项目的名称 -->
	<groupId>com.jadyer.blog</groupId>
	<!-- 项目的模块名称。建议用"项目名称-模块名称"。按照Maven的约定,此时Java类的包名就应该是com.jadyer.blog.dao -->
	<!-- 即通常项目中Java类包都应该基于项目的groupId和artifactId。虽然这不是必须的,但这些显然更加清晰、更加符合逻辑 -->
	<artifactId>blog-dao</artifactId>
	<!-- 项目的版本名称 -->
	<version>0.0.1.Release</version>
	<!-- 打包类型:默认为jar -->
	<packaging>jar</packaging>
	<!-- 用于声明一个对于用户而言更为友好的项目名称 -->
	<name>玄玉的手工博客系统之DAO模块</name>
	
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<junit.version>4.10</junit.version>
		<hibernate.version>3.6.10.Final</hibernate.version>
		<javassist.version>3.12.1.GA</javassist.version>
		<slf4j-simple.version>1.6.4</slf4j-simple.version>
		<mysql.driver.version>5.1.18</mysql.driver.version>
		<maven-source-plugin.version>2.1.2</maven-source-plugin.version>
		<maven-rar-plugin.version>2.2</maven-rar-plugin.version>
		<maven-shade-plugin.version>1.6</maven-shade-plugin.version>
		<maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
		<maven-surefire-plugin.version>2.14.1</maven-surefire-plugin.version>
		<sql-maven-plugin.version>1.5</sql-maven-plugin.version>
		<mysql.driver>com.mysql.jdbc.Driver</mysql.driver>
		<mysql.url>jdbc:mysql://127.0.0.1:3306/jadyer?characterEncoding=UTF-8</mysql.url>
		<mysql.username>root</mysql.username>
		<mysql.password>hongyu</mysql.password>
	</properties>

	<!-- 自动加入的依赖包,它们是通过项目坐标来找到依赖包的。所以用了maven之后就不需要再拷jar包了 -->
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<!-- 依赖的范围:默认为compile -->
			<!--     test:测试范围有效。即编译和打包时不会加入该依赖包 -->
			<!--  compile:编译范围有效。即编译和打包时会将该依赖包一并加入 -->
			<!-- provided:编译和测试时有效,最后生成war包时不会加入该依赖包。比如web容器本身已包含的servlet-api.jar,再打包则会冲突 -->
			<!--  runtime:运行范围有效,编译时则不依赖 -->
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>${javassist.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>${slf4j-simple.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.driver.version}</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- maven-source-plugin插件:打包项目源码 -->
			<!-- Run As Maven build : clean package -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-source-plugin</artifactId>
				<version>${maven-source-plugin.version}</version>
				<executions>
					<execution>
						<!-- 绑定在哪个周期。这里设定为package后绑定,即package后再运行maven-source-plugin插件 -->
						<!-- 注:maven生命周期中,package阶段负责接受编译好的代码并打包成可发布的格式,如JAR -->
						<phase>package</phase>
						<!-- 所要运行maven-source-plugin插件的目标 -->
						<goals>
							<goal>jar-no-fork</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!-- 将之打成rar压缩包 -->
			<!-- Run As Maven build : clean package -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-rar-plugin</artifactId>
				<version>${maven-rar-plugin.version}</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>rar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!-- 默认打包生成的jar是不能够直接运行的,因为带有main()方法的类信息不会被添加到manifest中 -->
			<!-- 为了生成可执行的jar文件,我们需要借助maven-shade-plugin插件,其配置信息如下 -->
			<!-- Run As Maven build : clean package -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>${maven-shade-plugin.version}</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<transformers>
								<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<!-- 配置<mainClass>为带有main()方法类。如此,项目在打包时就会将该信息放到/META-INF/MANIFEST.MF文件中 -->
									<!-- 构建完成后target目录会发现blog-dao-0.0.1.Release.jar和original-blog-dao-0.0.1.Release.jar -->
									<!-- 前者是带有Main-Class信息的可运行的jar,后者是原始的jar。然后我们到CMD窗口中切换到项目根目录中执行该jar -->
									<!-- D:\Develop\MyWorkspace\MavenStudy>java -jar target\blog-dao-0.0.1.Release.jar -->
									<mainClass>com.jadyer.util.ManiFestTest</mainClass>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<!-- 指明源码编译级别 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>${maven-compiler-plugin.version}</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
			<!-- 指明测试类的运行情况 -->
			<!-- Run As Maven build : clean package -->
			<!-- 可能是由于历史的原因,Maven2/3中用于执行测试的插件不是maven-test-plugin,而是maven-surefire-plugin -->
			<!-- 如果没有使用该插件,Maven默认会执行符合约定格式的测试类(即以Test开头或结尾、或者以TestCase结尾的Java类) -->
			<!-- 然而我们想跳过测试,或者排除某些测试类,或者使用一些TestNG特性的时候,该插件就很有必要了 -->
			<!-- 也可以执行Run As Maven build : clean package -Dtest=FooTest,其效果是仅运行FooTest测试类 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>${maven-surefire-plugin.version}</version>
				<configuration>
					<!-- 设置包含的测试类 -->
					<includes>
						<include>**/MyTest*</include>
					</includes>
					<!-- 设置不进行测试的类 -->
					<excludes>
						<exclude>Test*</exclude>
					</excludes>
					<!-- 跳过测试阶段,并且也不会编译测试类。若仅仅想跳过测试并编译测试类,则可用<skipTests>标签 -->
					<!-- <skip>true</skip> -->
				</configuration>
			</plugin>
			<!-- 生成测试报告(我们可以在生成的报告中轻松查看测试覆盖率等等) -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>cobertura-maven-plugin</artifactId>
				<configuration>
					<formats>
						<format>html</format>
						<format>xml</format>
					</formats>
				</configuration>
				<executions>
					<execution>
						<id>cobertura-report</id>
						<!-- 测试完成后就生成测试报告 -->
						<phase>test</phase>
						<goals>
							<goal>cobertura</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!-- 通过Maven来执行配置好的数据库脚本。可以在POM中配置sql命令,或将脚本写在文件中并在POM中配置文件位置 -->
			<!-- 最后,在CMD窗口中运行mvn sql:execute以执行所有脚本,或者在MyEclipse中Run As Maven build:clean package -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>sql-maven-plugin</artifactId>
				<version>${sql-maven-plugin.version}</version>
				<!-- 这是针对该插件的依赖包 -->
				<dependencies>
					<dependency>
						<groupId>mysql</groupId>
						<artifactId>mysql-connector-java</artifactId>
						<version>${mysql.driver.version}</version>
					</dependency>
				</dependencies>
				<configuration>
					<driver>${mysql.driver}</driver>
					<url>${mysql.url}</url>
					<username>${mysql.username}</username>
					<password>${mysql.password}</password>
					<!-- 该插件连接数据库成功后,所要运行的命令 -->
					<sqlCommand>create database IF NOT EXISTS jadyer_maven</sqlCommand>
				</configuration>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>execute</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

下面是位于//src//main//java//中的实体类User.java

package com.jadyer.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User {
	private int id;
	private String username;
	private String nickname;
	private String password;
	private String email;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

下面是位于//src//main//java//中的自定义工具类HibernateUtil.java

package com.jadyer.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private static SessionFactory factory = null;
	
	static{
		factory = new Configuration().configure().buildSessionFactory();
	}
	
	public static Session getCurrentSession(){
		return factory.getCurrentSession();
	}
}

下面是位于//src//main//resources//中的Hibernate配置文件hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.url">jdbc:mysql://127.0.0.1:3306/jadyer?characterEncoding=UTF-8</property>
		<property name="connection.username">root</property>
		<property name="connection.password">hongyu</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
		<property name="current_session_context_class">thread</property>
		<mapping class="com.jadyer.model.User"/>
	</session-factory>
</hibernate-configuration>

最后是位于//src//test//java//中的JUnit测试用例UserTest.java

package com.jadyer.test;

import org.hibernate.Session;
import org.junit.Assert;
import org.junit.Test;

import com.jadyer.model.User;
import com.jadyer.util.HibernateUtil;

public class UserTest {
	@Test
	public void addUser(){
		Session session = HibernateUtil.getCurrentSession();
		session.beginTransaction();
		User uu = new User();
		uu.setUsername("张起灵");
		uu.setNickname("闷油瓶");
		uu.setPassword("02200059");
		uu.setEmail("[email protected]");
		session.save(uu);
		session.getTransaction().commit();
		Assert.assertTrue(uu.getId() > 0);
	}
	
	@Test
	public void loadUser(){
		Session session = HibernateUtil.getCurrentSession();
		session.beginTransaction();
		User uu = (User)session.load(User.class, 2);
		session.getTransaction().commit();
		Assert.assertEquals(2, uu.getId());
	}
}

你可能感兴趣的:(maven,ant,maven3,Build,pom)