zoukankan      html  css  js  c++  java
  • Maven assembly插件进行自定义构建

    众所周知,Maven是一个约定优于配置的java构建工具,通常我们只需要定义非常少的内容,就可以根据package标签属性来构建生成的jar, war包的相关内容。

     

    如果想要对maven中依赖的内容一起打包,就需要使用maven-assembly-plugin来实现,对于该插件,其基本的配置如下:

     

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <mainClass>com.xxx.Main</mainClass>
                            </manifest>
                        </archive>
     
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
    </plugin>
     
     

     

    这样就会在执行clean package之后,构建出一个比较完整的jar包,jar包以jar-with-dependencies为后缀,带有其依赖的所有.class文件。

     

    但是,如果我们想要在Maven中进行比较复杂的构建,就肯定不够用了,需要根据实际情况进行不同的配置了。

     

    链接中对maven-assembly-plugin插件中的所有可选配置进行了详细说明,这里根据项目需要,我们做的一些简单配置。

     

    我们需要指定configuration下的具体package配置文件:

     

    <descriptors>                                  
           <descriptor>src/main/assemble/package.xml</descriptor>
    </descriptors>
     

     

    关于配置文件中具体元素的说明,可以参考下面的链接:

    http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_binaries

     

    <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>package</id>
        <formats>
            <format>jar</format>
    </formats>

     

     

    在package.xml中,我们首先指定其id和format,id可以在pom.xml文件中指定对应的configuration下的appendAssemblyId标签,将id附加到生成的jar包作为后缀。

    <appendAssemblyId>true</appendAssemblyId>
    

      

    项目中依赖比较多,而很多都是在执行时存在的,并不需要真正打包到实际环境中(比如依赖的hadoop包)。我们将整个项目用maven进行分模块构造后,依赖的模块内jar包需要打包到一起,以避免重新设置HADOOP_CLASSPATH。

     

    这就需要使用dependencySets标签,添加includes,将具体的依赖jar包打包到具体的生成jar包中。

     

    <dependencySets>
            <dependencySet>
                <unpack>true</unpack>
                <scope>runtime</scope>
                <includes>
                    <include>${groupId}:${artifactId}:${打包类型}:${version}</include>
    <!--例如:-->
                    <include>com.sun.mail:javax.mail:jar:1.5.2</include>
                </includes>
            </dependencySet>
        </dependencySets>

     

    unpack属性控制依赖的jar包是否进行解压操作,还是直接放在根目录下。如果设置了outputDirectory,将这些文件都放在该目录下。例如设置outputDirectory为lib,则所有的依赖文件都放在该目录下。

     

    如果解压后的文件放在特定的目录下,那么该jar包可能不能真正使用,需要在具体的MANIFEST.MF文件中并没有指定特定的CLASSPATH,否则就会包找不到具体的class。比如具体的格式如下:

    Manifest-Version: 1.0
    Main-Class: windows.VideoWindow
    Class-Path: liborg.eclipse.swt_3.3.0.v3346.jar liborg.eclipse.swt.win32.win32.x86_3.3.0.v3346.jar
     

     

    Class-Path: 后面的写法,空格分开,绝对不能有分号,且最后必须有换行。这个文件有着奇怪的分行和空格要求,在编写的时候需要注意。

     

    如何将自定义的MANIFEST.MF文件附加到打包的jar包中,这就需要使用configuration中的archieve标签。

    <archive>                     
          <manifestFile>src/main/assemble/MANIFEST.MF</manifestFile>
    </archive>

     

     

    至此,项目中使用的jar包就可以正常地构建了。在jar包构造过程中,jar的两个命令非常有用:

    jar –tf target/**.jar
    

      

    该命令能够列出jar包内的所有文件。

     

    jar –xf target/**.jar (指定文件)
    

     

    该命令能够将jar包中所有/指定文件解压到当前文件夹中。

  • 相关阅读:
    mssql:tsql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程;触发器trigger;播放器http://www.smartgz.com/blog/Article/956.asp
    str.Replace(" ","");
    DataGrid分页;指定列的总和和平均值;显示鼠标背景色;弹出式窗口;
    .net 面试题 (1)
    数据绑定技术_单值数据绑定示例;将 DataTable,DataSet,DataView,DataReader 绑定到 DataGrid 控件示例;DataBinder.Eval;数组的值赋给ListBox1;Hashtable 绑定到;RadioButtonList;将XML 文件做为数据源绑定到控件
    Lession 17 Always young 保持年轻
    智力面试题
    Lession 16 A Polite request 彬彬有礼的要求
    几道 C 语言面试题
    建表的范例脚本,存储过程中参数的命名
  • 原文地址:https://www.cnblogs.com/mmaa/p/5789920.html
Copyright © 2011-2022 走看看