Maven用户指南(2)

Java 发表评论

Maven 配置
属性的处理机制
Maven按下面的顺序依次读入properties文件:

${project.home}/project.properties
${project.home}/build.properties
${user.home}/build.properties

读入的属性遵循“最后的定义有效”原则。也就是说,Maven依次读入properties文件,以新的定义 覆盖旧的定义。${user.home}/build.properties是Maven最后处理的文件。我们把 这些文件称为Maven处理的标准属性文件集。

另外,上述properties文件处理完毕后,Maven才会开始处理系统属性。所以,如果在命令行中使用 象-Dproperty=value这样的形式来指定的属性,它会覆盖先前定义的同名属性。

插件的属性
上述属性文件处理完后,Maven才会开始调用插件,但是 PluginManager 会禁止插件 覆盖已经设置的属性值。这和Maven一般的属性处理方式是相反的,这是因为插件只能在Maven内部的 其他部分初始化完毕后才能处理,但是我们又希望以这样顺序去处理属性:

处理Plug-in 缺省属性
处理${project.home}/project.properties
处理${project.home}/build.properties
处理${user.home}/build.properties

这样一来,即使插件处于属性处理链的后端,也能覆盖插件的任何缺省属性。例如,Checkstyle插件 就定义了如下缺省属性:

maven.checkstyle.format = sun
你可能已经猜出来了,Checksytle插件把Sun的编码规范作为缺省的格式。但是我们仍然可以在标准属性 文件集的任何一个文件中覆盖这个属性。所以如果在${project.home}/project.properties 文件定义了如下属性值:

maven.checkstyle.format = turbine
Checkstyle就会使用Turbine的编码规范。

行为属性
下面的这些属性可以改变Maven的“行为方式”。

属性 描述 缺省值
maven.build.dest 目录名,存放编译生成的类  ${maven.build.dir}/classes
maven.build.dir 存放构建结果的目录,如类文件,文档,单元测试报告等等。
注意: 在${user.home}/build.properties文件中改变maven.build.dir 的缺省值或许会得到一个 较为个性化的目录布局。但是,这会干扰Maven由从源码开始的编译工作,因为它假设jar包 会被创建到${basedir}/target/目录中。
${basedir}/target
maven.build.src 源码目录  ${maven.build.dir}/src
maven.conf.dir 配置文件目录  ${basedir}/conf
maven.docs.dest html格式报告的输出目录  ${maven.build.dir}/docs
maven.docs.omitXmlDeclaration 产生的文档所应包含的xml声明头,如:
false
maven.docs.outputencoding 生成文档的缺省编码  ISO-8859-1
maven.docs.src 用户提供的文档目录  ${basedir}/xdocs
maven.gen.docs xdocs文档转换成html后的输出目录  ${maven.build.dir}/generated-xdocs
maven.home.local maven用于写入用户信息的本机目录,如解开插件包、缓冲数据。  ${user.home}/.maven
maven.mode.online 是否连接internet  true
maven.plugin.dir 插件的存放目录  ${maven.home}/plugins
maven.plugin.unpacked.dir 用于展开安装插件的目录  ${maven.home.local}/plugins
maven.repo.central 在进行dist:deploy处理的时候,发行包所要部署的目标机器  login.ibiblio.org
maven.repo.central.directory 在进行dist:deploy处理的时候,发行包所要部署的目标目录。  /public/html/maven
maven.repo.local 本机repository,用于存储下载的jar包。  ${maven.home.local}/repository
maven.repo.remote 远程repository,如果本机repository没有的jar包,maven会从这里下载。  http://www.ibiblio.org/maven  
maven.repo.remote.enabled 是否使用远程repository。  true
maven.scp.executable 用于安全拷贝的可执行程序  scp
maven.src.dir 基础源代码目录  ${basedir}/src
maven.ssh.executable 远程命令可执行程序  scp

使用代理
如果你只能通过代理访问,不要紧,Maven为你提供了下列属性:

代理属性 描述
maven.proxy.host 代理的IP地址  
maven.proxy.port 代理端口  
maven.proxy.username 如果代理需要认证的话,在这里填写用户名。 User name if your proxy requires authentication.  
maven.proxy.password 如果代理需要认证的话,在这里填写密码。  

如果你实在需要代理,最好在${user.home}/build.properties文件中指定。

## ———————————————————-
## ${user.home}/build.properties
## ———————————————————-
.
.
maven.proxy.host = my.proxyserver.com
maven.proxy.port = 8080
maven.proxy.username = username
maven.proxy.password = password
.
.
使用多个远程Repositories
你可以在任何Maven可以处理的属性文件中指定使用多个远程Repositories,如:

maven.repo.remote = http://www.ibiblio.org/maven /,http://www.mycompany.com/maven/

项目设置
开始一个新项目
如果你是第一次使用Maven,或者开始一个新的项目,你可以使用GenApp来自动创建Maven项目树。

maven -Dpackage=com.mycompany.app genapp
执行该命令后,屏幕显示如下:

__  __
|  //  |__ Jakarta _ ___
| |//| / _ / V / -_) ‘ /  ~ intelligent projects ~
|_|  |_/__,_|/_//___|_||_|   v. 1.0-beta-9

    [mkdir] Created dir: /genapp/src/java/com/mycompany/app
    [copy] Copying 1 file to /genapp/src/java/com/mycompany/app
    [mkdir] Created dir: /genapp/src/test/com/mycompany/app
    [copy] Copying 3 files to /genapp/src/test/com/mycompany/app
    [copy] Copying 2 files to /genapp
    [copy] Copying 1 file to /genapp/src/conf
    BUILD SUCCESSFUL
    Total time:  3 seconds
执行完毕,即生成下面的完整项目目录树:

.
|– project.properties
|– project.xml
`– src
    |– conf
    |   `– app.properties
    |– java
    |   `– com
    |       `– mycompany
    |           `– app
    |               `– App.java
    `– test
        `– com
            `– mycompany
                `– app
                    |– AbstractTestCase.java
                    |– AppTest.java
                    `– NaughtyTest.java

构建
Maven采用了集中管理库的理念。所有用于构建的jar包都是从集中管理的中心库上取出。目前, 我们的中心库放在这儿 Ibiblio. 在一个典型的Maven项目中,构建所需的 jar包会从中心库下载。Maven只会取回依赖链条上缺失的包。如果你使用Maven来构建几个项目, 这些项目可能会共享一些依赖包:Maven可以在任意个项目中共享同一个包,而无须在同一系统 中保持一个jar包的多个拷贝。

构建生命周期

在CVS中存放jar文件
我们不推荐你在CVS中存放jar包。Maven提倡在本机repository中存放用于构建共享的jar包或 和其他项目包。许多项目都依赖于诸如XML解析器、标准例程,这在Ant构建中,经常会被复制 多份。在Maven中,这些标准例程就存放在本地repository中,供任何项目构建使用。

重载已声明的依赖包
你可能会发现,在某些情况下允许重载POM中已经声明的依赖包会很方便,甚至很有必要。 你可能会希望使用文件系统中的某个JAR包,或者你希望简单重新指定某个包的版本。对于 这样的情况,Maven提供了一种简单的方式,允许你选择构建所需的jar包。我们严重建议 你设置本机repository,但是在简单至上,或在由ant构建迁移的情况下,JAR包重载特性 会显得非常方便。

为了使用JAR包重载特性,你必须将maven.jar.override 属性设置为 on。 只要设置了这个属性,就可以在任何maven处理的属性文件中重载JAR包。

关于JAR重载的指令有两种。第一种允许你指定某个特定的包的路径,作为JAR包;的二种 允许你指定某个特定的JAR包(这个jar包必须已经存在于本机repository)。下面是这两 种方式:

maven.jar.artifactId = [path]

maven.jar.artifactId = [version]

下面是一个使用JAR重载指令的属性文件例子:

# ————————————————————————
# M A V E N  J A R  O V E R R I D E
# ————————————————————————
maven.jar.override = on

# ————————————————————————
# Jars set explicity by path.
# ————————————————————————
maven.jar.a = ${basedir}/lib/a.jar
maven.jar.b = ${basedir}/lib/b.jar

# ————————————————————————
# Jars set explicity by version.
# ————————————————————————
maven.jar.classworlds = 1.0-beta-1

使用SNAPSHOT依赖
在Maven中,SNAPSHOP是某个特定项目的最新构建的jar包。如果你的项目依赖于另一个频繁变更 的项目,你可以在你的POM中声明SNAPSHOP依赖,以保持与那个项目的同步。例如,在你的POM中 这样写,你可以与Jelly保持 同步更新。

  …
  

   
     commons-jelly
     commons-jelly
     SNAPSHOT
   

  
… 上述语句的含义是:总是使用Maven repository中最新的Jelly构建包。SNAPSHOT依赖 总会导致依赖失败。在这种情况下,Maven就会去Maven repository取得一个SNAPSHOT 依赖包的拷贝。如果你正在离线工作,Maven就会发出警告:“SNAPSHO依赖包可能已经 过期”。

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *