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包,后续等持续集成环境搭建完毕后再考虑这种方式。

  • 相关阅读:
    Roce ofed 环境搭建与测试
    Ubuntu 1804 搭建NFS服务器
    Redhat 8.0.0 安装与网络配置
    Centos 8.1 安装与网络配置
    SUSE 15.1 系统安装
    VSpare ESXi 7.0 基本使用(模板、iso、SRIOV)
    VSpare ESXi 7.0 服务器安装
    open SUSE leap 15.1 安装图解
    KVM虚拟机网卡连接网桥
    GitHub Action一键部署配置,值得拥有
  • 原文地址:https://www.cnblogs.com/asfeixue/p/3626959.html
Copyright © 2011-2022 走看看