下载很简单,主要讲一下如何配置环境变量
;%MAVEN_HOME%\bin;
maven会加载settings.xml文件,可定义在多处,它的加载优先级如下:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/path/to/local/repolocalRepository>
<pluginGroups>
<pluginGroup>com.your.pluginspluginGroup>
pluginGroups>
<servers>
<server>
<id>deploymentRepoid>
<username>repouserusername>
<password>repopwdpassword>
server>
servers>
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
<profiles>
<profile>
<id>jdk-1.4id>
<activation>
<jdk>1.4jdk>
activation>
<repositories>
<repository>
<id>jdk14id>
<name>Repository for JDK 1.4 buildsname>
<url>http://www.myhost.com/maven/jdk14url>
<layout>defaultlayout>
<snapshotPolicy>alwayssnapshotPolicy>
repository>
repositories>
profile>
profiles>
<activeProfiles>
<activeProfile>alwaysActiveProfileactiveProfile>
<activeProfile>anotherAlwaysActiveProfileactiveProfile>
activeProfiles>
settings>
定义repository下载的目录
用于注册自定义插件
配置私服的用户名和密码
配置下载maven jar包的镜像
用于切换开发、测试、部署的环境
mvn -p dev
启用dev环境
新建的默认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">
<modelVersion>4.0.0modelVersion>
<groupId>com.learngroupId>
<artifactId>maven-projectartifactId>
<version>1.0-SNAPSHOTversion>
project>
指定了当前Maven模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0
类似package,公司名倒过来
groupId下一个功能的命名,或者说是项目名
版本号,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本。
结构为:
主版本号.次版本号.增量版本号-<里程碑版本>
groupId、artifactId、version三个元素生成了一个Maven项目的坐标
打包类型:jar、war、rar、ear、pom
描述,通常用于版权说明
定义一些变量,可以在dependency中引用
一般只出现在父pom里面
用于帮助管理chidren的dependencies,统一版本号
dependencyManagement下面所依赖的jar包,不会被children所依赖,但是可以管理children所依赖的版本
默认jar
定义在哪个阶段使用,以及会不会打到包(jar包,war包等)里面去
A–>B–>C。当前项目为A,A依赖于B,B依赖于C
当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C
最短路径原则
A->B->C->common1.1.jar
A->common1.0.jar
那么A最终会依赖common1.0.jar
加载先后原则
A->B
A->C
B->common1.0.jar
C->common1.1.jar
A同时依赖B和C,那么B和C谁先加载,就依赖谁的common.jar
解决jar包冲突,比如spring-core排除commons-loggoing
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
<exclusions>
<exclusion>
<artifactId>commons-loggingartifactId>
<groupId>commons-logginggroupId>
exclusion>
exclusions>
dependency>
一个完整的项目构建过程通常包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。
Maven的生命周期是抽象的,其中的具体任务都交由插件来完成。Maven为大多数构建任务编写并绑定了默认的插件,如针对编译的插件:maven-compiler-plugin。用户也可自行配置或编写插件。
Maven定义了三套生命周期:clean、default、site,每个生命周期都包含了一些阶段(phase)。三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,
且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。
比如执行package,前面的test、comiple等 会运行
default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。
运行方式 mvn 命令
编译,会下载相关jar包
执行的插件:maven-compiler-plugin:3.1:compile (default-compile)
删除target
执行的插件: maven-clean-plugin:2.5:clean (default-clean)
运行测试代码,比如JUnit写的测试
执行的插件:maven-surefire-plugin:2.18.1:test (default-test)
打包
执行的插件: maven-resources-plugin:2.7:resources (default-resources)
将打好的包安装到本地仓库(repository),供其他项目使用;
在多模块开发环境下,改了代码要执行下install,不然其他模块看不到最新的修改。
执行的插件:maven-install-plugin:2.5.2:install (default-install)
把本地jar包发送到远程仓库(私服)。
执行的插件:maven-deploy-plugin:2.8.2:deploy
静态代码检查
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>findbugs-maven-pluginartifactId>
<version>2.5.1version>
<configuration>
<threshold>Highthreshold>
<effort>Defaulteffort>
<findbugsXmlOutput>truefindbugsXmlOutput>
<findbugsXmlOutputDirectory>target/sitefindbugsXmlOutputDirectory>
configuration>
plugin>
plugins>
build>
统一升级父子模块版本号
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>versions-maven-pluginartifactId>
<version>2.3version>
plugin>
使用方法
mvn versions:set -DnewVersion=1.1
提供项目自动将源码打包并发布的功能
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.3version>
<executions>
<execution>
<id>attach-sourcesid>
<phase>installphase>
<goals>
<goal>jar-no-forkgoal>
goals>
execution>
executions>
plugin>
把java工程打包成为一个可执行的jar包
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<version>3.0.0version>
<configuration>
<archive>
<manifest>
<mainClass>com.learn.MyAppmainClass>
manifest>
archive>
<descriptorRefs>
<descriptorRef>jar-with-dependenciesdescriptorRef>
descriptorRefs>
configuration>
plugin>
执行mvn clean compile assembly:single
有时候你不想安装并在ide中配置tomcat,这时候可以使用tomcat插件
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<port>8080port>
<path>/path>
configuration>
plugin>
一个插件通常可以完成多个任务,每一个任务就叫做插件的一个目标。如执行mvn install命令时,调用的插件和执行的插件目标如下:
Maven的生命周期是抽象的,实际需要插件来完成任务,这一过程是通过将插件的目标(goal)绑定到生命周期的具体阶段(phase)来完成的。如:将maven-compiler-plugin插件的compile目标绑定到default生命周期的compile阶段,完成项目的源代码编译:
<groupId>com.learngroupId>
<artifactId>maven-projectartifactId>
<version>1.0-SNAPSHOTversion>
maven-plugin
<dependency>
<groupId>org.apache.mavengroupId>
<artifactId>maven-plugin-apiartifactId>
<version>3.5.0version>
dependency>
<dependency>
<groupId>org.apache.maven.plugin-toolsgroupId>
<artifactId>maven-plugin-annotationsartifactId>
<version>3.5version>
<scope>providedscope>
dependency>
@Mojo(name="learn",defaultPhase = LifecyclePhase.PACKAGE)
public class MyMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println("start plugin...");
}
}
这里挂载的phase是package
执行mvn clean install
<plugin>
<groupId>com.learn</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
执行mvn project:learn
执行日志如下:
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-cloud-config-client 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-project:1.0-SNAPSHOT:learn (default-cli) @ spring-cloud-config-client ---
start plugin...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
可以看到我们的插件生效了
但是如果我们直接执行mvn install
时是看不到这条打印的,说明没有生效。
需要添加executions
<plugin>
<groupId>com.learngroupId>
<artifactId>maven-projectartifactId>
<version>1.0-SNAPSHOTversion>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>learngoal>
goals>
execution>
executions>
plugin>
然后再执行mvn install
,可以看到:
[INFO] --- maven-project:1.0-SNAPSHOT:learn (default) @ spring-cloud-config-client ---
start plugin...
在项目中定义三个环境
修改xml:
<profiles>
<profile>
<id>devid>
<properties>
<profiles.active>devprofiles.active>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
<id>testid>
<properties>
<profiles.active>testprofiles.active>
properties>
profile>
<profile>
<id>proid>
<properties>
<profiles.active>proprofiles.active>
properties>
profile>
profiles>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resourcesdirectory>
<excludes>
<exclude>conf/**exclude>
excludes>
resource>
<resource>
<directory>src/main/resources/conf/${profiles.active}directory>
resource>
resources>
build>
执行mvn clean install -P pro
可以看到target中app.properties是pro的
待补充
模板化脚手架
新建一个普通maven项目,添加一些包和类
①在项目目录下执行 mvn archetype:create-from-project
②cd 到"target\generated-sources\archetype"
执行mvn install
此时,我们的脚手架已经生成成功了
根据上图的操作引用它
如果上面的生成工程失败,可以通过mvn archetype:generate -DarchetypeCatalog=local
命令来生成,选择我们的archetype即可
E:\workspace\idea_java>mvn archetype:generate -DarchetypeCatalog=local
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: local -> com.learn:maven-plugin-archetype (maven-plugin-archetype)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1
Define value for property 'groupId': com.learn
Define value for property 'artifactId': archetype-demo
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.learn: :
Confirm properties configuration:
groupId: com.learn
artifactId: archetype-demo
version: 1.0-SNAPSHOT
package: com.learn
Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: maven-plugin-archetype:1.0-SNAPSHOT
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.learn
[INFO] Parameter: artifactId, Value: archetype-demo
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.learn
[INFO] Parameter: packageInPathFormat, Value: com/learn
[INFO] Parameter: package, Value: com.learn
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: groupId, Value: com.learn
[INFO] Parameter: artifactId, Value: archetype-demo
[WARNING] Don't override file E:\workspace\idea_java\archetype-demo\.idea\inspectionProfiles\Project_Default.xml
[INFO] Project created from Archetype in dir: E:\workspace\idea_java\archetype-demo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 28.770 s
[INFO] Finished at: 2018-10-14T13:13:19+08:00
[INFO] Final Memory: 14M/245M
[INFO] ------------------------------------------------------------------------
然后可以看到,生成的项目中有我们脚手架模板里面的类