为了兼容之前基于ant构建的项目发布包结构,在基于maven做构建的时候,需要自定义打包方式。

maven的maven-assembly-plugin插件支持任意格式的打包,比如:dir,zip等形式。项目的maven工程结构,如下所示:

(图一)

发布包结构如下所示:

(图二)

最初的想法是父模块等待子模块全部构建完成之后,将子模块构建后的jar全部拷贝到父模块的target的合适位置。但是,maven构建的时候优先构建父模块,子模块的构建依托其依赖关系决定。而且,父模块不能依赖子模块,否则导致循环依赖。因此,在子模块这一层添加一个distribution,专门负责自定义打包的处理,其依赖所有同一层的子模块。

kernel-distribution中maven-assembly-plugin的定义:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                       
                        <configuration>
                            <descriptors>
                                <descriptor>assembly/assembly.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

其assembly.xml的定义:

<?xml version="1.0" encoding="UTF-8"?>
<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>kernel</id>
    <formats>
        <format>dir</format>
    </formats>
    <baseDirectory>platform</baseDirectory>
    <includeBaseDirectory>false</includeBaseDirectory>

<moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
            <includes>
                <include>com.dcits.universe:remote</include>
            </includes>
            <binaries>
                <outputDirectory>kernel</outputDirectory>
                <unpack>false</unpack>
                <includeDependencies>false</includeDependencies>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

其中,moduleSet专门用于这种maven父子模块的场景,用于将包含的模块打包到指定目录下,在这里就是outputDirectory所配置的内容。

但是在多层次的父子模块中,比如图一所示,kernel-distribution只是构建出自己这一层次的目录结构。因为有多层次的目录结构,那么就需要在每一个层次上加一个distribution,来帮助构建这一层次的目录结构。

如图一所示,universe-distribution和kernel-distribution没有任何关系,但是显然universe-distribution需要包含kernel-distribution构建的内容。

因此,其assembly.xml的定义如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
    http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>core</id>
    <formats>
        <format>zip</format>
    </formats>
    <baseDirectory>platform</baseDirectory>
    <includeBaseDirectory>false</includeBaseDirectory>

<fileSets>
        <fileSet>
            <includes>
                <include>*/**</include>
            </includes>
            <directory>../L1-kernel/L1-kernel-distribution/target/L1-kernel-distribution-${version}-kernel</directory>
            <outputDirectory>platform</outputDirectory>
        </fileSet>
        <fileSet>
            <includes>
                <include>*/**</include>
            </includes>
            <directory>../environment</directory>
            <outputDirectory>environment</outputDirectory>
        </fileSet>
        <fileSet>
            <includes>
                <include>*/**</include>
            </includes>
            <directory>../configuration</directory>
            <outputDirectory>configuration</outputDirectory>
        </fileSet>
        <fileSet>
            <includes>
                <include>*/**</include>
            </includes>
            <directory>../bin</directory>
            <outputDirectory>bin</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

因为在定义上层模块的时候,universe-distribution是最后一个模块。

<modules>
        <module>L1-kernel</module>
        <module>L2-infrastructure</module>
        <module>L3-operatingFramework</module>
        <module>client</module>
        <module>universe-distribution</module>
    </modules>

这样,在maven构建的时候,可以保证之前所有的模块都已经构建完成。因此这里只需要拷贝文件即可。当然,这种方式略显粗糙,但是,基本思路就这样了,以后再优化。

这样的打包方式很类似之前spring的发布包的方式,一个zip包包含所有的spring的jar与源码,文档等,而且进行分目录的排列。但是现在spring的版本都是通过maven来发布,不再直接发布这种zip包,后续等持续集成环境搭建完毕后再考虑这种方式。

maven学习(二)的更多相关文章

  1. Maven学习 二 Maven环境搭建

    第一步:下载Maven并解压 注意选择镜像地址,选择国内的会快点 解压目录 Maven目录分析 bin:含有mvn运行的脚本 boot:含有plexus-classworlds类加载器框架 conf: ...

  2. maven学习二(dependencies)

    在前面一篇文章maven学习一(HelloWorld工程)已经对maven有了基本介绍,本文开始介绍maven依赖,通过如何如何增加log4j来学习maven的dependencies no-depe ...

  3. Maven学习 (二) Eclipse 上安装 Maven3插件

    eclipse 安装插件的方式最常见的有两种: 1. 一种是在线安装,这貌似是用的最多的,就是:Help  -->  Install New Software,然后输入 HTTP 地址来安装,但 ...

  4. Maven学习二:使用Nexus搭建Maven私服及相关配置

    处于安全等原因的考虑,一些企业内部网络是不允许访问外部网络的,但是项目内部搭建的项目又是Maven架构,这样就需要企业在内部网络中搭建自己的Maven仓库服务,再者一些大型企业或者内部模块化组件化划分 ...

  5. Maven学习(二)-----Maven启用代理访问

    Maven启用代理访问 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配 ...

  6. Maven学习系列二(1-5)

    Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...

  7. (转)Maven学习总结(二)——Maven项目构建过程练习

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...

  8. maven学习之二M2_HOME简介

    在<maven学习之一>中介绍了M2_HOME指向了maven的安装目录,如下图: weiwan..................

  9. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

  10. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

随机推荐

  1. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(5)

    数据操作与REST API(Data manipulation with REST API) ElasticSearch REST API可用于各种任务.多亏了它,我们可以管理索引,更改实例参数,检查 ...

  2. document.getElementsByClassName方法的重写(OVERRIDE)

    众所周知,对于IE8以下的浏览器(IE8居然是WIN7预装的)没有document.getElementsByClassName,网上也有很多重写的方法,以下是本人在项目中所使用的方法 documen ...

  3. HDU 1890 Robotic Sort(splay)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1890 [题意] 给定一个序列,每次将i..P[i]反转,然后输出P[i],P[i]定义为当前数字i ...

  4. c#调用c++ dll的几种类型(转)

    http://www.sosuo8.com/article-2012/dllleixingzhuanhuan.htm   在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传 ...

  5. HDU-4720 Naive and Silly Muggles 圆的外心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 先两两点之间枚举,如果不能找的最小的圆,那么求外心即可.. //STATUS:C++_AC_0M ...

  6. 教你区分LVDS屏线及屏接口定义

    现在碰到液晶屏大多是LVDS屏线,经常碰到什么单6,双6 单8双8.如何区分呢?我以前也不知道,后在网上收集学习后才弄明白方法1数带 “ -”的这种信号线一共有几对,有10对的减2对就是双8,有8对的 ...

  7. quotation

    1. 如果不能修心,则诸事繁杂!; 2. 人生,是该追求平淡长久,还是绚烂短暂,我想人人都有自己的答案,但阅历或者情感,都不是越多越好,烂桃三筐不如鲜杏一个,是古老的俗话,却至今鲜活有力.以量取胜,实 ...

  8. HDU 5795 A Simple Nim (博弈 打表找规律)

    A Simple Nim 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5795 Description Two players take turns ...

  9. thymeleaf比较符号问题

    比较器与平等: 值表达可以是>.<.> =.< =符号,像往常一样,也是= =和!=操作符可以用来检查平等,但是>.<.> =.< =不能用,要用gt ...

  10. HTML5新增的CSS类API