Maven 自问自答
Apache Maven,作为一个项目管理和综合的工具,说起来很尴尬,一直以来,我都是把他当成一个依赖管理的工具而已,方便的地方就是我不用到处找jar包。同时,我还把他和IDE工具紧密的依赖在一起,每次都是用IDE工具去生成maven,这样看起来真的很糟糕,所以,写这篇自问自答来补全一下知识。
maven有什么用
maven作为一个项目构建和管理的工具,提供了帮助管理、构建、文档、报告、依赖、发布、分发的方法,可以方便的编译代码、进行依赖管理、管理二进制库等等,有利于项目过程的规范化、自动化、高效化、增强了可扩展性。
POM 是一个什么东西
project object model ,项目对象模型。pom中包含了项目的信息和maven build项目所需要的配置信息,通常有项目信息、依赖、插件、goal、build等等。pom是可以被继承的,因此有扩展性。
解读pom
<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.chen</groupId>
<artifactId>my_spring_boot</artifactId>
<packaging>war</packaging>
<name>my_spring_boot Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>0.5.0.BUILD-SNAPSHOT</version>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- Package as an executable JAR -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- Allow access to Spring milestones and snapshots -->
<!-- (you don't need this if you are using anything after 0.5.0.RELEASE) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
modelVersion:是object model版本,除非maven开发者升级版本,否则不需要修改。
groupId:指的是项目构建团体或组织唯一标识符,通常是域名倒写。
artifactId:指的是项目名。
package:指的是打包方式:jar、war、ear等等,默认jar。
version artifact:通常是0.0.1-SNAPSHOT,开发版。
name:maven文档中,目的展示名。
url:项目地址。
dependencies:依赖。
parent:父类的pom。
snapshot :快照仓库。
pluginRepositories:插件仓库。
Build Lifecycle
一个项目build的过程。maven的Build Lifecycle分为三种,分别为default(处理项目的部署)、clean(处理项目的清理)、site(处理项目的文档生成)。他们都包含不同的lifecycle。
maven 三条指令运行web项目
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=packageName -DartifactId=webappName
示例:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.chen.web -DartifactId=my_mavencd my_maven
mvn tomcat:run -Dmaven.tomcat.port=8080
maven常用指令
mvn compile:编译源代码
mvn test-compile:编译测试代码
mvn clean:清空
mvn test:运行测试
mvn package:打包项目
mvn install:安装打包的jar到本地仓库
mvn clean package:清楚target再打包
maven结构
my-app
|--pom.xml
|--src
|--main
|--java
|--com
|--mycompany
|--app
|--App.java
|--test
|--java
|--com
|--mycompany
|--app
|--AppTest.java
maven快照版是什么
如果maven依赖都是release,那么每次更新以来都是要更换版本才能下载,这样就麻烦了,比如 你依赖的依赖是处于开发期中的,那么每次他修改一次代码(会很频繁),就要升级一次版本,所以maven2推出了snapshot快照仓库和release发布仓库。
dependency中的scope含义
maven打包的时候,是否进行打包。
-compile:默认范围
-provided:说明jdk或容器已经提供这依赖
-runtime:运行和测试需要,编译不需要
-test:测试需要
-system:和provided一样
maven坐标是什么
坐标就是maven构件的定位。比如说junit:junit:4.8.2表示的就是仓库中的路径/junit/junit/4.8.2/junit-4.8.2.pom和/junit/junit/4.8.2/junit-4.8.2.jar这个文件。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
version
<主版本>.<次版本>.<增量版本>-<限定符>
Classifier
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>JDK15</classifier>
</dependency>
定义version的版本
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-beans</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-context</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-core</artifactId>
<version>2.5</version>
</dependency>
以上代码可改为
<properties>
<spring.version>2.5</spring.version>
</properties>
<depencencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</depencencies>
多模块中统一一些依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块就可以简化成
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactid>log4j</artifactId>
</dependency>