zoukankan      html  css  js  c++  java
  • maven学习(二)

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

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

    image

    (图一)

    发布包结构如下所示:

    image

    (图二)

    最初的想法是父模块等待子模块全部构建完成之后,将子模块构建后的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包,后续等持续集成环境搭建完毕后再考虑这种方式。

  • 相关阅读:
    000-ESP32学习开发(SDK)-ESP32开发板使用说明
    2-STM32 替换说明-CKS32, HK32, MM32, APM32, CH32, GD32, BLM32, AT32(推荐), N32, HC华大系列
    002-CH579M学习开发-官方资料学习说明,开发板蓝牙(蓝牙定位),网口通信测试
    001-CH579M学习开发-硬件使用说明,下载和运行第一个程序
    STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-硬件使用说明
    17-网络芯片CH395Q学习开发-片内EEPROM读写实验
    16-网络芯片CH395Q学习开发-低功耗实验
    15-网络芯片CH395Q学习开发-DNS 域名解析
    14-1-网络芯片CH395Q学习开发-WEB服务器-网页到底是啥, web服务器是啥, 网页如何显示的显示图片和视频
    13-网络芯片CH395Q学习开发-模块使用Socket0作为MAC RAW
  • 原文地址:https://www.cnblogs.com/asfeixue/p/3626959.html
Copyright © 2011-2022 走看看