项目目录
一个标准的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.youkuaiyun.com/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>