Maven用户指南(3)

Maven的Reactor工具用于控制多项目构建,按照项目间的依赖关系安排构建顺序,鼓励创建小而独立的组件。Reactor可用于项目站点生成、jar包构建等任务。db.apache.org站点的构建就是Reactor的一个应用实例,它整合子项目信息,生成统一的站点。离线构建可通过-maven.mode.online=false参数实现,避免下载依赖。测试资源和打包配置也在文中有所提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多项目构建和Reactor
在Maven中,Reactor是一个用于控制多项目构建的工具。Reactor用Werkz包,并根据每个项目 各自定义的依赖关系来安排构建顺序。Reactor的意图在于:鼓励创建/重构具有更小、更松散、 更有一致性单元的项目。r源于面向组件编程,在向组件编程中,整个系统由许多松散的个体 构成,这些个体需要聚合起来作为一个整体进行部署。

Reactor可以为某个项目集执行一个任意编排的目标列表。所以,如果使用Reactor的话,它 可以用来做项目站点生成,任意jar包生成这样的事情。

目前 db.apache.org 站点就是收集了其子项目的 丰富信息、并与一系列的Velocity 模板合成的。这一过程是由 Jelly Velocity 标签库来完成的。 这里是其中的机制,有兴趣可以看看。

Plexus(一个基于Avalon的容器)组件的manifest是遍历所有Plexus组件、并聚合而成的。这里 使用的还是Velocity模板和Jelly Volocity标签库。 这里是其中的机制,有兴趣可以看看。

这里是一个使用Reactor标签,遍历一系列组件,最后产生项目站点的例子:

  <goal
    name="project-site"
    description="Generate the site for the entire project">

    <!-- Generate the site for each of the components. -->

    <maven:reactor
      basedir="${basedir}/components"
      postProcessing="true"
      includes="*/project.xml"
      excludes="bad-component/*"
      goals="site"
      banner="Generating Site"
      ignoreFailures="true"/>

    <!--
     |
     | At this point because 'postProcessing' was turned on we have all
     | the processed POMs available to us in the ${reactorProjects} variable.
     |
     -->

    <j:forEach var="reactorProject" items="${reactorProjects}">

      ... Do whatever you want with the harvested information ...

    </j:forEach>
  </goal>
  如果你需要聚合N个项目的文档,形成一个统一的视图,你可以参考 db.apache.org站点,它从所有的子项目中收集 信息,最终形成一个有导航条,邮件列表,开发者列表和源码repository统一的站点。这解决 了在收集子项目信息过程中的冗余、易于产生错误的问题。db.apache.org的子项目只需关注 自身的信息,却可以自动的集成到高层的项目站点中。

离线构建
如果你需要离线构建,你得在命令行中使用离线选项:

maven -o jar:jar
        这等同于:

maven -Dmaven.mode.online=false jar:jar
        或者你可以在属性文件中设置 maven.mode.online 属性为false。

在联机模式下,maven总是下载 SNAPSHOT 依赖包, 请参考 使用SNAPSHOT依赖。如果本机repository 上的当前版本比服务器上的还要新,你也许不想maven覆盖你的当前版本。如果不想下载,你可以 设置属性:

maven.repo.remote.enabled=false
        在maven beta 9版本中,这个属性并没有起作用(新版本已经解决了这个问题)。可以这样来清空 maven.repo.remote 属性:

maven.repo.remote.enabled=
        在命令行或属性文件中设置都一样。

在下面的情形中,你需要同时设置maven.repo.remote.enabled=false maven.mode.online=true:希望javadoc插件的"-link"选项起作用,而又不希望 下载任何(包括snapshot)包。

命令行选项介绍
如果你用命令行来构建,这里提供了一个关于命令行选项的快速参考。

Options:
-D,--define arg   定义一个系统属性
-E,--emacs        输出简洁的日志信息
-X,--debug        输出debug信息
-b,--nobanner     禁止 logo banner
-d,--dir arg      设置指定的工作目录
-e,--exception    输出异常堆栈信息
-f,--find arg     通过搜寻项目文件来确定执行的项目文件及其工作目录
-g,--goals        显示可用的目标
-h,--help         显示帮助信息
-i,--info         显示系统信息
-o,--offline      离线构建
-p,--pom arg      指定项目文件
-v,--version      显示版本号

测试
测试资源
通常情况下,你需要在测试类路径上为测试指定某些资源。你可以在POM中使用

下面的例子说明了如何递归的包含在${basedir}/src/test目录中所有以.xml和.properties为扩展名 的文件:

<project>
  ...
  <build>
    ...
    <unitTest>
      ...
      <resources>
        <resource>
          <directory>${basedir}/src/test</directory>
          <includes>
            <include>**/*.xml</include>
            <include>**/*.properties</include>
          </includes>
        </resource>
      </resources>
    </unitTest>
  </build>
</project>
下面的例子说明了如何递归的包含在${basedir}/src/test目录中所有以.xml和.properties为扩展名 的文件,但naughty.properties文件除外。请注意增加的 project/build/unitTest/resources/excludes 节点:

  <project>
    ...
    <build>
      ...
      <unitTest>
        ...
        <resources>
          <resource>
            <directory>${basedir}/src/test</directory>
            <includes>
              <include>**/*.xml</include>
              <include>**/*.properties</include>
            </includes>
            <excludes>
              <exclude>naughty.properties</exclude>
            </excludes>
          </resource>
        </resources>
      </unitTest>
    </build>
  </project>
运行一个单独的测试
下面的命令运行了一个单独的测试:

maven -Dtestcase=org.foo.bar.MyTest test:single-test

打包
JAR 资源

<project>
  ...
  <build>
    <resources>
      <!-- A -->
      <resource>
        <directory>${basedir}/src/conf</directory>
        <includes>
          <include>*.xml</include>
          <include>*.properties</include>
        </includes>
      </resource>
      <!-- B -->
      <resource>
        <directory>${basedir}/src/messages</directory>
        <targetPath>org/apache/maven/messages</targetPath>
        <includes>
          <include>messages*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>
</project>

部署

固化SNAPSHOT依赖
在开发时使用SNAPSHOT依赖包非常方便,但是在部署的时候,你需要把所有的SNAPSHOT依赖包 固定下来,以便发布一个包含固定jar的版本。如果你发布了一个含SNAPSHOT依赖包的项目,而 这些SNAPSHOT在项目发布后发生了变更,你可能很快就会发现这个版本没法儿工作。

当SNAPSHOT以时间戳为版本号部署到Maven上时,Maven可以识别foo-SNAPSHOT.jar实际上相当 于foo-20030101.010101.jar。当部署的时刻来临,你可以用下面的命令,让Maven把SNAPSHOT 版本号变为时间戳版本号。

maven convert-snapshots
Maven会提供交互的方式让你选择哪个SNAPSHOPT依赖包应该固化下来。这一过程结束后,Maven 就会把刚才你的选择写会你的POM。

如果你希望Maven简单的、尽可能最好的固化SNAPSHOT依赖包,你可以用下面的命令:

maven convert-snapshots-auto

拷贝依赖JAR包
在maven.xml这样写下面的语句是最简单的拷贝依赖包的方法。

<project
  xmlns:deploy="deploy">

  <goal name="deploy-my-project">
    ...
    <deploy:copy-deps todir="/path"/>
    ...
  </goal>

</project>
用deploy:copy-deps标签你就可以简单的把项目所有的依赖包拷贝到任何 目录,如果希望排除某个依赖包,需要给出一个依赖包的id列表,列表中依赖包就不会被拷贝。

<project
  xmlns:deploy="deploy">

  <goal name="deploy-my-project">
    ...
    <deploy:copy-deps todir="/path" excludes="servletapi,commons-util"/>
    ...
  </goal>
</project> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值