Maven使用入门

 项目目录

一个标准的maven项目目录如下

src:源代码目录。所有的源代码都被放在了这个目录下。在这个目录下又包括了: 

    1) main:所有的源代码放在这里。对于Java项目,还有一个下级子目录:java. 对于Flex项目则是flex。

    2) test:所有的单元测试类放在这里。

target:所有编译过的类文件以及生成的打包文件(.jar, .war, ...)放在这里。

 

编写pom

Pom文件用于描述项目如何构建,声明项目依赖等等。先看一个列子

<?xml version="1.0" encoding="UTF-8"?>

<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.zengmiao.test</groupId>

<artifactId>zmtest</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>pom</packaging>

<name>test</name>

<!--默认打包成jar包-->

 <packaging>war</packaging>

<url>http://maven.apache.org</url>

 
<properties>

<jdk.version>1.6</jdk.version>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<servlet>3.0.1</servlet>

<jackson.version>2.1.5</jackson.version>

<spring.version>3.2.8.RELEASE</spring.version>

<spring-security.version>3.2.4.RELEASE</spring-security.version>

<hibernate.version>3.6.10.Final</hibernate.version>

<c3p0.version>0.9.1</c3p0.version>

<hibernate-validator.version>4.1.0.Final</hibernate-validator.version>

<slf4j.version>1.7.5</slf4j.version>

<log4j.version>1.2.17</log4j.version>

<commons-lang3.version>3.1</commons-lang3.version>

<commons-io.version>2.4</commons-io.version>

<commons-net.version>3.3</commons-net.version>

<commons-fileupload.version>1.2.2</commons-fileupload.version>

<ant.version>1.9.4</ant.version>

<jetty.version>8.1.16.v20140903</jetty.version>

<cxf.version>2.7.11</cxf.version>

<quartz.version>2.2.1</quartz.version>

<quartz-jobs.version>2.2.1</quartz-jobs.version>

<jasperreports.version>4.7.1</jasperreports.version>

</properties>

 

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>3.8.1</version>

<scope>test</scope>

</dependency>

.......

<dependency>

<groupId>org.apache.axis2</groupId>

<artifactId>axis2-transport-local</artifactId>

<version>1.6.2</version>

</dependency>

<!-- axis2 -->

</dependencies>

<build>

<plugins>

<!-- compiler插件, 设定JDK版本 -->

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>${jdk.version}</source>

<target>${jdk.version}</target>

</configuration>

</plugin>

 

<!-- jetty插件, 设定context path与spring profile -->

<plugin>

<groupId>org.mortbay.jetty</groupId>

<artifactId>jetty-maven-plugin</artifactId>

<version>${jetty.version}</version>

<configuration>

<jvmArgs>-XX:MaxPermSize=128m</jvmArgs>

   <contextXml>src/test/resources/conf/jetty-context.xml</contextXml> 

<scanIntervalSeconds>200</scanIntervalSeconds>

<webAppConfig>

<contextPath>/${project.artifactId}</contextPath>

</webAppConfig>

</configuration>

</plugin>

</plugins>

</build>

<!--模块化,后期讲-->

<modules>

<module>abmp</module>

<module>abmp-user</module>

<module>abmp-task</module>

<module>abmp-common</module>

<module>abmp-notice</module>

<module>abmp-daily</module>

<module>abmp-question</module>

<module>abmp-assessment</module>

<module>abmp-audit</module>

    <module>abmp-other</module>

    <module>abmp-report</module>

  </modules>

</project>

  

坐标元素

groupId artifactId  version(简称gav)这三个元素定义了一个项目基本的左边,在maven的世界里,任何jar pom war 都是基于这些基本的坐标进行区分的。

groupId:定义了项目属于哪个组

artifactId:定义了当前maven项目组中的唯一id

version版本号

packing:(可以为空)项目打包后的输出,默认为jar。指为war项目打包生成一个web项目。

以下为非必须(但要了解):

<type> ,package类型,一般不用写,默认是jar。还有,jar/war/pom/maven-plugin/ear等。

<scope>,依赖范围,我简记为“能见度”。例如,

test=测试。仅对测试类有效,在java类中引入会报错的。例如,JUnit

compile=编译+测试+运行,默认不写则是这种编译方式,对于编译、测试、运行都有效。例如,spring-core

provided=编译+测试。对于编译和测试有效,运行时无效。例如,servlet-api,其在编译和测试时需要使用,但在运行时由于容器已经提供,所以不需要mvn重新的引入一遍。

runtime=运行时。例如,JDBC驱动实现,类的编译只需JDK提供的JDBC接口即可,在真正执行测试或运行时才需实现上述接口的具体JDBC驱动。

<optional>,可选依赖。例如,A->B,B->C(optional=true),那么A将对C不形成传递依赖。

<exclusions>,排除依赖。例如,A->B, B->C(1.0-SNAPSHOT),而我实际想用C2.0,那么就需要在B中将C给排除出去。

 更多更全的解释请参考:http://blog.csdn.net/longeremmy/article/details/9670619

 

对于同一模块的jar包,可以在pom中通过统一变量进行定义

声明<properties><springframework.version>2.5.6</…>

引用<version>${springframework.version}</…>

 

命令说明

Cd 到项目路径后 mvn eclipse:eclipse 生成Eclipse工程

Mvn jetty:run 启动jetty

mvn -h,帮助。

 Mvn clean 清除生成结果

mvn clean compile,编译 将.java类编译为.class文件,编译前会清空;

mvn clean test, 执行单元测试。本质上,还是执行了一个完整的生命周期,clean:clean, resources:resources, compiler:compile, resources:testResources, compiler:testCompile

mvn clean package,进行打包。

mvn clean install –Dmaven.test.skip(跳过测试)

mvn clean install,将某jar包安装到maven本地仓库中。

mvn archetype:generate,快速的搭建项目骨架,输入一些groupId/artifactId/version等信息,由mvn插件自动生成一些必要的依赖和项目骨架。

 

 

生命周期

 Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

 

依赖

此部分摘自http://chwshuang.iteye.com/blog/2069937?utm_source=tuicool  

大家都知道Maven的优点是依赖管理,特别是前期使用ANT的开发者都有很多感触。最近要开发一个java工程,定的要使用maven,会使用hadoop和hbase的客户端,而引入一个hadoop-client的jar或者hbase的jar包,会依赖十几个其他的jar包,而这些jar包的功能我又用不上,所以这种依赖反倒成了工程瘦身的负担。关键我还有强迫症,见到这些对工程无用的包,我就抓狂。所以在网上百找千寻,找到了几个方法:

1. 项目间传递

    如果我的当前项目是project1,project1要依赖project2,project1依赖project2的配置中加上 <optional>true</optional>,表示依赖可选,

<dependency>
	<groupId>com.projecct</groupId>
	<artifactId>project2</artifactId>
	<version>1.0</version>
	<scope>compile</scope>
	<optional>true</optional>
</dependency>

 那么以后所有声明依赖project1的项目如果也依赖project2,就必须写手动声明。比如project3依赖project1和project2,如果project3只声明了对project1的依赖,那么project2不会自动加入依赖,需要重新声明对project2的依赖。

这种方式排除不了我项目中对第三方jar包所依赖的其他依赖,因为我不可能去修改第三方jar包的pom文件,所以只适合在项目组内部使用。

2. 依赖过滤

(1)单依赖过滤

       同依赖过滤直接处理:可以过滤一个或者多个,如果过滤多个要写多个<exclusion>。这个也解决不了我的问题,或者说解决太麻烦,我那里知道hbase要依赖那些包,记不住。

<dependency>    
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase</artifactId>
	<version>0.94.17</version> 
	<exclusions>  
		 <exclusion>	 
			 <groupId>commons-logging</groupId>		
			 <artifactId>commons-logging</artifactId>  
		 </exclusion>  
	</exclusions>  
</dependency>

(2)多依赖过滤

     把所以依赖都过滤了。手起刀落~啊,世界都安静了。

<dependency>
	<groupId>org.apache.hbase</groupId>
	<artifactId>hbase</artifactId>
	<version>0.94.17</version>
	<exclusions>
		<exclusion>
			<groupId>*</groupId>
			<artifactId>*</artifactId>
		</exclusion>
	</exclusions>
</dependency>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值