Maven入门实战笔记-11节[1-5]

Maven入门实战笔记01
 
Windows上安装Maven
1.JDK检查
echo %JAVA_HOME%
java -version
 
 
2.下载Maven
http://maven.apache.org/download.html
3.本地安装
设置环境变量
M2_HOME     D:\tools\apache-maven-3.0.5
Path                %M2_HOME%\bin
 
 测试安装
 
 
---------------------------------------------------------------------------------
安装eclipse Mave插件(m2eclipse)
http://m2eclipse.sonatype.org/sites/m2e
---------------------------------------------------------------------------------
Maven安装最佳实践
1.设置MAVEN_OPTS环境变量
MAVEN_OPTS    -Xms128m -Xmx512m
原因:Java默认的最大可用内存往往不能够满足Maven运行的需要,如不配置,容易导致java.lang.OutOfMemoryError
2.配置用户范围setting.xml
%M2_HOME%/conf/settings.xml或者 用户名/.m2/settings.xml前者全局范围,后者用户范围,没有./m2/settings.xml可向%M2_HOME%/conf/settings.xml复制
3.不要使用IDE内嵌的Maven
 
 
 
 
 ---------------------------------------------------------------------------------
参考:
《Maven实战》许晓斌 著
 
 
****************************************************
Maven入门实战笔记02
 
Maven版HelloWorld
Maven目录结构
 
 
 
 
 
1.编写POM
目录hello-world/pom.xml
 
Pom.xml代码  
<?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.ydc.ln.mvndemo</groupId>  
    <artifactId>hello-world</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <name>Maven Hello World Project</name>  
  
    <dependencies>  
        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.11</version>  
            <scope>test</scope>  
        </dependency>  
    </dependencies>  
  
    <build>  
        <plugins>  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-shade-plugin</artifactId>  
                <version>2.0</version>  
                <executions>  
                    <execution>  
                        <phase>package</phase>  
                        <goals>  
                            <goal>shade</goal>  
                        </goals>  
                        <configuration>  
                            <transformers>  
                                <transformer  
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  
                                    <mainClass>com.ydc.ln.mvn.helloworld.HelloWorld</mainClass>  
                                </transformer>  
                            </transformers>  
                        </configuration>  
                    </execution>  
                </executions>  
            </plugin>  
        </plugins>  
    </build>  
</project>  
Pom.xml代码  
<?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.ydc.ln.mvndemo</groupId>  
    <artifactId>hello-world</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <name>Maven Hello World Project</name>  
  
    <dependencies>  
        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.11</version>  
            <scope>test</scope>  
        </dependency>  
    </dependencies>  
  
    <build>  
        <plugins>  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-shade-plugin</artifactId>  
                <version>2.0</version>  
                <executions>  
                    <execution>  
                        <phase>package</phase>  
                        <goals>  
                            <goal>shade</goal>  
                        </goals>  
                        <configuration>  
                            <transformers>  
                                <transformer  
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  
                                    <mainClass>com.ydc.ln.mvn.helloworld.HelloWorld</mainClass>  
                                </transformer>  
                            </transformers>  
                        </configuration>  
                    </execution>  
                </executions>  
            </plugin>  
        </plugins>  
    </build>  
</project>  
 
 
2.编写主代码
目录:hello-world/src/main/java/com/ydc/ln/mvn/helloworld/HelloWorld.java
 
Java代码  
package com.ydc.ln.mvn.helloworld;  
  
public class HelloWorld  
{  
    public static void main(String[] args) {  
        System.out.println(new HelloWorld().sayHello());  
    }  
  
    public String sayHello() {  
        return "Hello Maven";  
    }  
}  
Java代码  
package com.ydc.ln.mvn.helloworld;  
  
public class HelloWorld  
{  
    public static void main(String[] args) {  
        System.out.println(new HelloWorld().sayHello());  
    }  
  
    public String sayHello() {  
        return "Hello Maven";  
    }  
}  
 
 
3.编写测试代码
目录hello-world/src/test/java/com/ydc/ln/mvn/helloworld/HelloWorldTest.java
4.打包和运行(相关命令)
 
Mvn代码  
mvn clean  
Mvn代码  
mvn clean  
 
Mvn代码  
mvn clean compile  
Mvn代码  
mvn clean compile  
 这是第一次运行时,Maven需要下载相关jar包,保存在 用户名\.m2\repository 文件夹下
 
 这是Maven第二次运行该命令
 
 
Mvn代码  
mvn clean test  
Mvn代码  
mvn clean test  
 
 
 
Mvn代码  
mvn clean package  
Mvn代码  
mvn clean package  
 
Mvn代码  
mvn clean install [-U]  
Mvn代码  
mvn clean install [-U]  
 
Cmd代码  
java -jar target\hello-world-1.0-SNAPSHOT.jar  
Cmd代码  
java -jar target\hello-world-1.0-SNAPSHOT.jar  
 
 
  
以下命令
--查看当前项目已解析依赖
--具体看优化依赖
Mvn代码  
mvn dependency:list  
Mvn代码  
mvn dependency:list  
 
 
 
Mvn代码  
mvn dependency:tree  
Mvn代码  
mvn dependency:tree  
 
 
 
Mvn代码  
mvn dependency:analyze  
Mvn代码  
mvn dependency:analyze  
 
 
 
 
hello-world.rar (2.3 KB)
下载次数: 0
 
 
***************************************************************
Maven入门实战笔记03-坐标和依赖
坐标
1.坐标,就是构件(各种jar包)的地址
2.坐标元素:
groupId:定义当前Maven项目隶属的实际项目,类似于java的包名,如com.iteye.ln-ydc.mvndemo(com.iteye.ln-ydc是组织名,mvndemo是实际项目名)
artifactId:定义实际项目中的一个Maven项目(模块)
version:定义Maven项目当前所处的版本
packaging:定义Maven项目的打包方式,默认为jar
classifier:帮助定义构建输出的一些附属构件
注:1.groupId、artifactId、version必须定义,packaging可选,classifier不能直接定义
2.项目构件的文件名是与坐标相对应的,一般规则:artifactId-version[-classifier].packaging
-------------------------------------------------------------------------
依赖
1.依赖范围
compile:编译
test:测试
provided:已提供依赖范围(对编译和测试classpath有效)
runtime:运行时
system:系统
import:导入
2.依赖范围与classpath的关系
依赖范围(scope)
编译
测试
运行
例子
compile
Y
Y
Y
spring-core
test
-
Y
-
JUnit
provided
Y
Y
-
servlet-api
runtime
-
Y
Y
jdbc driver
system
Y
Y
-
本地的
 
 
 
 
 
 
 
 
 
 
3.传递性依赖
A依赖B,B依赖C,A与B的依赖关系为传递性依赖
4.传递性依赖和依赖范围
A对B的依赖为第一直接依赖范围,B对C的依赖为第二直接依赖范围,A对C的依赖为传递性依赖范围
 
compile
test
provided
runtime
compile
compile
-
-
runtime
test
test
-
-
test
provided
provided
-
provided
provided
runtime
runtime
-
-
runtime
 
 
 
 
 
 
 
 
5.依赖调解
原则一:路径近者优先,如A->B-C->X(1.0)、A->D->X(2.0),X(2.0)会被解析使用
原则二:第一声明者优先,依赖路径长度相同,先声明者优先
6.可选依赖
A依赖于B,B依赖于X(可选),B依赖于Y(可选),即A->B,B->X(可选),B->Y(可选)
由于X、Y是可选依赖,依赖将不会得以传递
例如:B有两个特性X和Y,且这两个特性互斥,如B支持MySQL和Oracle两种数据库,因此,当项目A依赖于项目By时,如果实际使用基于MySQL数据库,那么在项目A中就需要显式地声明mysql-connector-java这一依赖
在理想情况下,是不应该使用可选依赖的
使用可选依赖,是某一个项目实现了多个特性
单一职责原则,一个类就该只有一项职责
7.最佳实践
1.排除依赖,不稳定的版本要排除,声明稳定的版本
2.归类依赖,对于一类依赖的版本进行统一定义
3.优化依赖,以下命令参考Maven入门实战笔记02中的相关命令
Mvn代码  
mvn dependency:list  
  
mvn dependency:tree  
  
mvn dependency:analyze  
Mvn代码  
mvn dependency:list  
  
mvn dependency:tree  
  
mvn dependency:analyze  
 used undeclared dependencies ,项目中使用到,但是没有显式声明的依赖,这种依赖存在潜在的风险
显式声明 任何项目中直接用到的依赖
unused declared dependencies,项目中未使用的,但是显式声明的依赖,对这一类依赖,应仔细分析
 
 
************************************************************************
Maven入门实战笔记04-仓库
 
仓库
区分 坐标和依赖与仓库
构件的逻辑表示方式:坐标和依赖
构件的物理表示方式:文件(Maven通过仓库来统一管理文件)
 
1.仓库
Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库
2.仓库的布局
groupId/artifactId/version/artifactId-version.packaging
3.仓库的分类
本地仓库
默认本场仓库目录 :用户名/.m2/repository
自定义本地仓库目录地址,编辑文件~/.m2/settings.xml
 
Xml代码  
<settings>  
  <localRepository>D:\java\respository</localRepository>  
</settings>  
Xml代码  
<settings>  
  <localRepository>D:\java\respository</localRepository>  
</settings>  
 将本地项目的构件装到Maven仓库中
Mvn代码  
mvn clean install  
Mvn代码  
mvn clean install  
 该命令将项目的构件输出文件安装到本地仓库中
 
远程仓库
安装好 Maven后,本地仓库目录是不存在的,当输入第一条Maven命令后,Maven才会创建本地仓库,根据配置和需要,从远程仓库下载构件至本地仓库
中央仓库
Maven必须知道至少一个可用的远程仓库
中央仓库是一个默认的远程仓库,Maven安装文件自带了中央仓库的位置
%M2_HOME%/lib/maven-model-builder-3.0.5.jar中
org\apache\maven\model\pom-4.0.0.xml
 
Xml代码  
<repositories>  
  <repository>  
    <id>central</id>  
    <name>Central Repository</name>  
    <url>http://repo.maven.apache.org/maven2</url>  
    <layout>default</layout>  
    <snapshots>  
      <enabled>false</enabled>  
    </snapshots>  
  </repository>  
</repositories>  
Xml代码  
<repositories>  
  <repository>  
    <id>central</id>  
    <name>Central Repository</name>  
    <url>http://repo.maven.apache.org/maven2</url>  
    <layout>default</layout>  
    <snapshots>  
      <enabled>false</enabled>  
    </snapshots>  
  </repository>  
</repositories>  
 包含这段配置的文件是所有Maven项目都会继承的超级POM
 
私服
一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用
优点:节省自己的外网带宽、加速Maven构建、部署第三方构件、提高稳定性,增强控制、降低中央仓库的负荷
4.远程仓库的配置
配置JBoss Maven仓库,在POM中配置
 
Java代码  
<project>  
    <repositories>  
        <repository>  
            <id>jboss</id>  
            <name>JBoss Repository</name>  
            <url>http://repository.jboss.com/</url>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
        </repository>  
        <snapshots>  
            <enabled>false</enabled>  
            <updatePolicy>daily</updatePolicy>  
            <checksumPolicy>ignore</checksumPolicy>  
        </snapshots>  
        <layout>default</layout>  
    </repositories>  
</project>  
Java代码  
<project>  
    <repositories>  
        <repository>  
            <id>jboss</id>  
            <name>JBoss Repository</name>  
            <url>http://repository.jboss.com/</url>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
        </repository>  
        <snapshots>  
            <enabled>false</enabled>  
            <updatePolicy>daily</updatePolicy>  
            <checksumPolicy>ignore</checksumPolicy>  
        </snapshots>  
        <layout>default</layout>  
    </repositories>  
</project>  
 
 
如上配置:Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件
default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局(不明白)
updatePolicy:daily(默认),never,always,interval:X(每隔X分钟检查一次更新)
checksumPolicy:warn(默认),fail,ignore
远程仓库的认证
配置仓库信息可以直接配置在POM文件中,认证信息必须配置在settings.xml中(POM往往被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机)
demo,编辑settings.xml
 
Java代码  
<settings>  
    <servers>  
        <server>  
            <id>my-proj</id>  
            <username>admin</username>  
            <password>password</password>  
        </server>  
    </servers>  
</settings>  
Java代码  
<settings>  
    <servers>  
        <server>  
            <id>my-proj</id>  
            <username>admin</username>  
            <password>password</password>  
        </server>  
    </servers>  
</settings>  
 
 
部署至远程仓库
Maven对项目进行编译、测试、打包外,还能将项目生成的构建部署到仓库中
编辑项目的pom.xml文件
 
Java代码  
<project>  
    <distributionManagement>  
        <repository>  
            <id>proj-releases</id>  
            <name>Proj Release Repopsitory</name>  
            <url>http://192.168.1.100/content/repositories/proj-releases/</url>  
        </repository>  
        <snapshotRepository>  
            <id>proj-snapshots</id>  
            <name>Proj Snapshot Repopsitory</name>  
            <url>http://192.168.1.100/content/repositories/proj-snapshots/</url>  
        </snapshotRepository>  
    </distributionManagement>  
</project>  
Java代码  
<project>  
    <distributionManagement>  
        <repository>  
            <id>proj-releases</id>  
            <name>Proj Release Repopsitory</name>  
            <url>http://192.168.1.100/content/repositories/proj-releases/</url>  
        </repository>  
        <snapshotRepository>  
            <id>proj-snapshots</id>  
            <name>Proj Snapshot Repopsitory</name>  
            <url>http://192.168.1.100/content/repositories/proj-snapshots/</url>  
        </snapshotRepository>  
    </distributionManagement>  
</project>  
需要认证时,需配置认证信息
 
配置正确后,运行命令
Mvn代码  
mvn clean deploy  
Mvn代码  
mvn clean deploy  
 
 
5.快照版本
为什么区分发布版和快照版?例小张开发模块A的2.1版本,小季开发模块B,B依赖于A,小张需要将最新的构建输出,交给小季,供其开发和集成高度,工作如何进行?
Maven的快照版本机制:
小张将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布过程中,Maven会自动为构件打上时间戳。如2.1-20130309.233559-12表示2013年03月09日23点35分59秒的第12次快照;小季配置对于模块A的2.1-SNAPSHOT的最新构件,当发现有更新时便进行下载。默认情况下,Maven每天检查一次更新(由仓库配置的upldatePolicy控制),用户也可以使用命令行-U参数强制让Maven检查更新,如
Java代码  
mvn clean install -U  
Java代码  
mvn clean install -U  
 当项目需要发布时,将快照版本更改为发布版本。例如将2.1-SNAPSHOT更改为2.1,表示该版本已经稳定且对应了唯一的构件;2.1-SNAPSHOT往往对应了大量的带有不同时间戳的构件,这也决定了其不稳定性
 
快照版本只应该在组织内部的项目或模块间依赖使用(组织对于这些快照版本的依赖具有完全的理解及控制权)
项目不应该依赖于任何组织外部的快照版本依赖(快照版本的不稳定性,造成潜在危险)
6.从仓库解析依赖的机制
仓库元数据groupId/artifactId/versionmaven-metadata.xml
RELEASE:最新发布版本
LATEST:最新版本(包含快照)
依赖声明中使用LATEST和RELEASE是不推荐的做法(因为Maven随时都可能解析到不同的构件)
7.镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像
如:http://maven.net.cn/content/groups/public/是中央仓库http://repo1.maven.org/maven2/在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务
编辑settings.xml
 
Java代码  
<settings>  
    <mirrors>  
        <mirror>  
            <id>maven.net.cn</id>  
            <name>one of the central mirrors in China</name>  
            <url>http://maven.net.cn/content/groups/public</url>  
            <mirrorOf>central</mirrorOf>  
        </mirror>  
    </mirrors>  
</settings>  
Java代码  
<settings>  
    <mirrors>  
        <mirror>  
            <id>maven.net.cn</id>  
            <name>one of the central mirrors in China</name>  
            <url>http://maven.net.cn/content/groups/public</url>  
            <mirrorOf>central</mirrorOf>  
        </mirror>  
    </mirrors>  
</settings>  
 <mirrorOf>值为central表示该配置为中央仓库的镜像
注:http://maven.net.cn/content/groups/public/这个镜像现在好像不能用了
 
如镜像需要认证,也可以基于该id配置仓库认证
镜像的一个常见应用:结合私服
如:
Java代码  
<settings>  
    <mirrors>  
        <mirror>  
            <id>internal-repository</id>  
            <name>Internal Repository Manager</name>  
            <url>http://192.168.1.100/maven2/</url>  
            <mirrorOf>*</mirrorOf>  
        </mirror>  
    </mirrors>  
</settings>  
Java代码  
<settings>  
    <mirrors>  
        <mirror>  
            <id>internal-repository</id>  
            <name>Internal Repository Manager</name>  
            <url>http://192.168.1.100/maven2/</url>  
            <mirrorOf>*</mirrorOf>  
        </mirror>  
    </mirrors>  
</settings>  
 <mirrorOf>值为星号,表示该配置是所有Maven仓库的镜像,任何远程仓库的请求都会被转至http://192.168.1.100/maven2/。
 
如果该镜像仓库需要认证,则配置一个id为internal-repository的<server>即可
更高级的镜像配置:
 
Java代码  
<mirrorOf>*</mirrorOf>          匹配所有远程仓库  
<mirrorOf>external:*</mirrorOf>     匹配所有远程仓库,使用localhost、file://协议的除外,即匹配所有不在本机上的远程仓库  
<mirrorOf>repo1,repo2</mirrorOf>    匹配仓库repo1和repo2  
<mirrorOf>*,!repo1</mirrorOf>       匹配所有远程仓库,repo1除外  
Java代码  
<mirrorOf>*</mirrorOf>          匹配所有远程仓库  
<mirrorOf>external:*</mirrorOf>     匹配所有远程仓库,使用localhost、file://协议的除外,即匹配所有不在本机上的远程仓库  
<mirrorOf>repo1,repo2</mirrorOf>    匹配仓库repo1和repo2  
<mirrorOf>*,!repo1</mirrorOf>       匹配所有远程仓库,repo1除外  
 
 
注意:由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库出问题时,Maven仍将无法访问被被镜像仓库,因而将无法下载构件
8.仓库的搜索服务
Sonatype Nexus    http://repository.sonatype.org/
Jarvana                  http://www.jarvana.com/jarvana/
MVNbrowser         http://mvnbrowser.com/
MVNrepository      http://mvnrepository.com/
 
************************************************************
Maven入门实战笔记05-生命周期和插件
 
Maven核心概念:坐标、依赖、仓库、生命周期、插件
生命周期:抽象
插件:具体
生命周期
1.Maven生命周期:清理、初始化、编译、打包、集成测试、验证、部署和站点生成
--------------------------
2.三套生命周期:clean、default、site
clean生命周期:(1)pre-clean (2)clean (3)post-clean
default生命周期:
Java代码  
validate:验证  
initialize:初始化配置  
generate-sources:生成源代码编译目录  
process-sources:处理项目主资源文件,复制资源文件到outputclasspath  
generate-resources:生成资源目录  
process-resources:处理资源文件  
complie:编译源代码  
process-classes:处理编译后文件  
generate-test-sources:生成测试目录  
process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath  
generate-test-resources:生成测试资源文件  
process-test-resources:处理测试资源文件  
test-compile:编译测试代码  
process-test-classes:处理测试代码  
test:单元测试运行测试代码  
prepare-package:打包前的准备  
package:将编译好的代码打包成为jar或者war或者ear等等  
pre-integration-test:准备整体测试  
integration-test:整体测试  
post-integration-test:为整体测试收尾  
verify:验证  
install:安装到本地Maven库  
deploy:将最终包部署到远程Maven仓库  
Java代码  
validate:验证  
initialize:初始化配置  
generate-sources:生成源代码编译目录  
process-sources:处理项目主资源文件,复制资源文件到outputclasspath  
generate-resources:生成资源目录  
process-resources:处理资源文件  
complie:编译源代码  
process-classes:处理编译后文件  
generate-test-sources:生成测试目录  
process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath  
generate-test-resources:生成测试资源文件  
process-test-resources:处理测试资源文件  
test-compile:编译测试代码  
process-test-classes:处理测试代码  
test:单元测试运行测试代码  
prepare-package:打包前的准备  
package:将编译好的代码打包成为jar或者war或者ear等等  
pre-integration-test:准备整体测试  
integration-test:整体测试  
post-integration-test:为整体测试收尾  
verify:验证  
install:安装到本地Maven库  
deploy:将最终包部署到远程Maven仓库  
 
site生命周期:(1)pre-site (2)site (3)post-site (4)site-deploy
--------------------------
3.命令行与生命周期
mvn clean:调用clean生命周期的clean阶段,实际调用pre-clean->clean
mvn test:调用default生命周期的test阶段,实际调用validate...->test
mvn clean install:调用clean生命周期的clean阶段和default生命周期的install阶段
mvn clean deploy site-deploy:
--------------------------------------------------------------------
插件
1.插件目标
插件本身能够完成多个任务,为了代码复用
多个任务(功能)聚集在一个插件里,每个功能就是一个插件目标
插件有多个目标,每个目标对应一个功能
如:插件maven-dependency-plugin
(1)dependency:analyze    分析项目依赖
(2)dependency:tree    列出项目的依赖树
(3)dependency:list    列出项目所有已解析的依赖
...
通用写法:冒号前是插件前缀,冒号后是插件目标
类似:compiler:compile(插件maven-compiler-plugin的compile目标)
surefire:test(插件maven-surefire-plugin的test目标)
--------------------------
2.插件绑定
Maven的生命周期与插件相互绑定,有以完成实际的构建任务。
(生命周期的阶段与插件的目标相互绑定,以完成 某个具体的构建任务)
--------------------------
3.内置绑定
 
 
 
--------------------------
4.自定义绑定
用户自己选择将某个插件目标绑定到生命周的某个阶段
例:创建项目的源码jar包
已知maven-source-plugin的jar-no-fork目标能将项目的主代码打包成jar文件
可以将其绑定到default生命周期的verify阶段上,参照default生命周期知,执行install命令时,调用default生命周期的validate到install阶段,而verify阶段在install阶段前
(在执行完集成测试后和安装构件之前创建源码jar包)
 修改项目的pom.xml,进行自定义绑定插件目标
 
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-source-plugin</artifactId>  
            <version>2.1.1</version>  
            <executions>  
                <execution>  
                    <id>attach-sources</id>  
                    <phase>verify</phase>  
                    <goals>  
                        <goal>jar-no-fork</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-source-plugin</artifactId>  
            <version>2.1.1</version>  
            <executions>  
                <execution>  
                    <id>attach-sources</id>  
                    <phase>verify</phase>  
                    <goals>  
                        <goal>jar-no-fork</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  
 在POM的build元素下的plugins子元素中声明插件的使用
 
对于自定义绑定的插件,用户总是应该声明一个非快照版本,这样可以避免由于插件版本变化造成的构建不稳定性
上述配置:插件声明、插件执行配置
executions下每个execution子元素可以用来配置执行一个任务
该例中配置了一个id为attach-sources的任务,
通过phrase配置,将其绑定到default生命周期的verify阶段上
再通过goals配置指定要执行的插件目标
可以通过对比配置前与配置后 执行mvn install命令的命令行输出
配置前执行 mvn verify
 
 
配置后执行 mvn verify
 
 
有时,即使不通过phase元素配置生命周期阶段,插件目标也能够绑定到生命周期中去
如删除上述配置中的phase一行,执行mvn verify,仍可看到maven-source-plugin:jar-no-fork的执行
原因是有很多插件的目标在编写时已经定义了默认绑定阶段
可用maven-help-plugin查看插件详细信息,了解插件目标的默认绑定阶段
 
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail  
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail  
 输出如下:
 
 
-X 查看出错信息
-U 强制更新
 可以看到这样一句:
 
Java代码  
Bound to phase: package  
Java代码  
Bound to phase: package  
 它表示该目标默认绑定的生命周期阶段是package
 
当插件目标被绑定到不同的生命周期阶段的时候,其执行顺序会由生命周期的先后顺序决定
当多个插件目标被绑定到同一个阶段的时候,这些插件声明的先后顺序决定了目标的执行顺序
 
--------------------------
 5.插件配置
完成插件和生命周期绑定后,还可配置插件目标的参数,进一步调整插件目标所执行的任务,
可通过命令行和POM等方式 配置这些参数
命令行插件配置
可以使用-D参数来配置插件目标的参数
maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true时,就会跳过执行测试
Java代码  
mvn install -Dmaven.test.skip=true  
Java代码  
mvn install -Dmaven.test.skip=true  
注:-D是Java自带的,其功能是通过命令行设置一个Java系统属性,Maven简单地重用了该参数,在准备插件的时候检查系统属性,便实现了插件参数的配置
 
 POM中插件全局变量
 并不是所有的插件参数都适合从命令行配置
有些不会改变或很少改变参数的值,在POM文件中一次性配置就比重复在命令行输入要方便
用户可以在声明插件的时候,对此插件进行一个全局的配置
如:配置maven-compiler-plugin告诉它编译Java 1.5版本的源文件,生成JVM1.5兼容的字节码文件
在POM中对插件进行全局配置
 
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <version>2.1</version>  
            <configuration>  
                <source>1.5</source>  
                <target>1.5</target>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <version>2.1</version>  
            <configuration>  
                <source>1.5</source>  
                <target>1.5</target>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
 若从命令行指定,如下:
 
 
Java代码  
mvn compile -Dmaven.compiler.compilerVersion=1.5  
Java代码  
mvn compile -Dmaven.compiler.compilerVersion=1.5  
 疑问:若默认是1.4,此时直接执行 mvn compile会出错,如上述命令,加上参数不会出错,但是执行
Java代码  
mvn install -Dmaven.compiler.compilerVersion=1.5  
Java代码  
mvn install -Dmaven.compiler.compilerVersion=1.5  
 此时设置参数无效,还是默认使用1.4,这种情况要怎样设置编译版本呢?
 POM中插件任务配置
除了为插件配置全局参数,用户还可以为某个插件任务配置特定的参数,
例:maven-antrun-plugin,它有一个目标run,可以用来在Maven中调用Ant任务。
用户将maven-antrun-plugin:run绑定到多个生命周期阶段上,再加以不同的配置,就可让Maven在不同的生命阶段执行不同任务。
在POM中对插件进行任务配置
 
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-antrun-plugin</artifactId>  
            <version>1.3</version>  
            <executions>  
                <execution>  
                    <id>ant-validate</id>  
                    <phase>validate</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <tasks>  
                            <echo>I'm bound to validate phase.</echo>  
                        </tasks>  
                    </configuration>  
                </execution>  
                <execution>  
                    <id>ant-verify</id>  
                    <phase>verify</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <tasks>  
                            <echo>I'm bound to verify phase.</echo>  
                        </tasks>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-antrun-plugin</artifactId>  
            <version>1.3</version>  
            <executions>  
                <execution>  
                    <id>ant-validate</id>  
                    <phase>validate</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <tasks>  
                            <echo>I'm bound to validate phase.</echo>  
                        </tasks>  
                    </configuration>  
                </execution>  
                <execution>  
                    <id>ant-verify</id>  
                    <phase>verify</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <tasks>  
                            <echo>I'm bound to verify phase.</echo>  
                        </tasks>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  
 注:执行如下命令出错
Java代码  
mvn maven-antrun-plugin:run  
Java代码  
mvn maven-antrun-plugin:run  
错误信息:
Java代码  
[ERROR] No plugin found for prefix 'maven-antrun-plugin' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (D:\data\win_user\win7_ydc\.m2\repository), central (http://repo.maven.apache.org/maven2)] -> [Help 1]  
[ERROR]  
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.  
[ERROR] Re-run Maven using the -X switch to enable full debug logging.  
[ERROR]  
[ERROR] For more information about the errors and possible solutions, please read the following articles:  
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException  
D:\WorkStation\maven\hello-world>  
Java代码  
[ERROR] No plugin found for prefix 'maven-antrun-plugin' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (D:\data\win_user\win7_ydc\.m2\repository), central (http://repo.maven.apache.org/maven2)] -> [Help 1]  
[ERROR]  
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.  
[ERROR] Re-run Maven using the -X switch to enable full debug logging.  
[ERROR]  
[ERROR] For more information about the errors and possible solutions, please read the following articles:  
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException  
D:\WorkStation\maven\hello-world>  
  --------------------------
6.获取插件信息
 
在线插件信息
主要Maven插件都来自Apache和Codehaus
Apache官方插件
列表:http://maven.apache.org/plugins/index.html
下载:http://repo1.maven.org/maven2/org/apache/maven/plugins/
托管于Codehaus上的Mojo项目也提供了大量Maven插件
列表:http://mojo.codehaus.org/plugins.html
下载:http://repository.codehaus.org/org/codehaus/mojo/
使用maven-help-plugin描述插件
获取插件maven-compiler-plugin 2.1版本的信息
 
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1  
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1  
 截图如下:
 
 
 
 
还可以加参数-Ddetail了解更详细
 
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1 -Ddetail  
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1 -Ddetail  
 主要包括该插件的坐标、目标前缀各目标
 
目标前缀(Goal Prefix),作用方便在命令行直接运行插件
maven-compiler-plugin的目标前缀是compiler
可以简化命令
 
Java代码  
mvn help:describe -Dplugin=compiler  
Java代码  
mvn help:describe -Dplugin=compiler  
 如果仅仅描述某个插件的目标信息,加上goal参数
 
 
Java代码  
mvn help:describe -Dplugin=compiler -Dgoal=compile  
Java代码  
mvn help:describe -Dplugin=compiler -Dgoal=compile  
 如果想输出更详细信息,加上detail参数
 
 
Java代码  
mvn help:describe -Dplugin=compiler -Ddetail  
Java代码  
mvn help:describe -Dplugin=compiler -Ddetail  
 不明白:此时用目标前缀获取的是最新版本或最新稳定版本,但是用目标前缀查看指定版本是不行的,就只能用全称
 
 
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1  
Java代码  
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1  
 该命令正确
 
 
Java代码  
mvn help:describe -Dplugin=compiler:2.1  
Java代码  
mvn help:describe -Dplugin=compiler:2.1  
 该命令错误
 
--------------------------
7.从命令行调用插件
 
Java代码  
mvn -h  
Java代码  
mvn -h  
 该命令显示mvn命令帮助
 
可以通过mvn命令激活生命周期阶段,从而执行那些绑定在生命周期阶段上的插件目标
Maven还支持直接从命令行调用插件目标
(因为有些任务不适合绑定在生命周期上,
如maven-help-plugin:describe,maven-dependency-plugin:tree)
 
Java代码  
mvn help:describe -Dplugin=compiler  
  
mvn dependency:tree  
Java代码  
mvn help:describe -Dplugin=compiler  
  
mvn dependency:tree  
 问:help是什么?为什么不是maven-dependency-plugin:tree?
 
 
Java代码  
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=complier  
  
mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree  
Java代码  
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=complier  
  
mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree  
 注:上面第一条出错,不知为啥?
 
后两条命令的效果也前两条基本是一样的,显然前两条命令更简洁,更容易记忆和使用
为了达到该目的,Maven引入了目标前缀的概念
格式:
Java代码  
mvn orgId:artifactId:version:goal  
Java代码  
mvn orgId:artifactId:version:goal  
 简化为:
 
 
Java代码  
mvn 目标前缀:goal  
Java代码  
mvn 目标前缀:goal  
 
 
--------------------------
8.插件解析机制
插件仓库
与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中
Maven会区别对待依赖的远程仓库与插件的远程仓库(Maven需要的插件在本地仓库不存在时, 它就不会去这些远程仓库查找)
不同于repositories及其repository子元素,插件的远程仓库使用pluginRepositories和pluginRepository配置
如Maven内置了如下的插件远程仓库配置
%M2_HOME%/lib/maven-model-builder-3.0.5.jar中
org\apache\maven\model\pom-4.0.0.xml文件
 
Java代码  
<pluginRepositories>  
  <pluginRepository>  
    <id>central</id>  
    <name>Central Repository</name>  
    <url>http://repo.maven.apache.org/maven2</url>  
    <layout>default</layout>  
    <snapshots>  
      <enabled>false</enabled>  
    </snapshots>  
    <releases>  
      <updatePolicy>never</updatePolicy>  
    </releases>  
  </pluginRepository>  
</pluginRepositories>  
Java代码  
<pluginRepositories>  
  <pluginRepository>  
    <id>central</id>  
    <name>Central Repository</name>  
    <url>http://repo.maven.apache.org/maven2</url>  
    <layout>default</layout>  
    <snapshots>  
      <enabled>false</enabled>  
    </snapshots>  
    <releases>  
      <updatePolicy>never</updatePolicy>  
    </releases>  
  </pluginRepository>  
</pluginRepositories>  
 配置其他的插件仓库,在POM或者settings.xml中加入其他的插件仓库配置
 
插件的默认groupId
在POM中配置插件时,如果该插件是Maven的官方插件(即groupId为org.apache.maven.plugins),就可以省略goupId配置,如:
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <version>2.1</version>  
            <configuration>  
                <source>1.7</source>  
                <target>1.7</target>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
Java代码  
<build>  
    <plugins>  
        <plugin>  
            <artifactId>maven-compiler-plugin</artifactId>  
            <version>2.1</version>  
            <configuration>  
                <source>1.7</source>  
                <target>1.7</target>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
 不推荐
 
解析插件版本
为了简化插件的配置和使用,在用户没有提供插件版本的情况下,Maven会自动解析插件版本
1.Maven在超级POM中为所有核心插件设定了版本,这些插件包括clean、compiler、surefire
2.若使用某个插件时没有设定版本,而这个插件以不属于核心插件范畴,Maven会检查所有仓库中可用版本(Maven2解析机制:最新版本,也可能是快照版;Maven3解析机制:不解析至latest,而使用release),两种机制都有潜在风险
使用插件的时候,应该一直显式地设定版本
解析插件前缀
Maven在解析插件仓库元数据时,会默认使用org.apache.maven.plugins和org.codehaus.jojo两个groupId。
可以通过设置settings.xml让Maven检查其他groupId上的插件仓库元数据
 
Java代码  
<settings>  
    <pluginGroups>  
        <pluginGroup>com.your.plugins</pluginGroup>  
    </pluginGroups>  
</settings>  
Java代码  
<settings>  
    <pluginGroups>  
        <pluginGroup>com.your.plugins</pluginGroup>  
    </pluginGroups>  
</settings>  
 
 
******************************************************************************
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值