使用maven-assembly插件构建完整的发布包

在日常java工程开发中,经常使用的打包方式是:打成jar包、web工程打成war包、脚本直接运行的完整的发布包。前2种利用mvn直接发布,这里介绍一下利用maven的assembly插件构建一个完成的发布包,他的目标是:一个发布包,放到服务器上,解压后,直接执行脚本。

再通过一张图看看我们最终的程序目录结构。

这张图主要是4个目录,logs目录是执行程序后,日志输出时自动生成的,其他的三个目录,是自动构建的

bin
conf 
lib
logs #日志输出时自动生成的

直接看看pom.xml文件中maven-assembly插件的配置,主要是指定assemble具体的文件位置。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
            <descriptor>src/main/assemble/package.xml</descriptor><!-- 这里是具体配置文件的位置 -->
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal><!-- 只运行一次 -->  
            </goals>
        </execution>
    </executions>
</plugin>

再看看src/main/assemble/package.xml的配置

<assembly xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/assembly-1.0.0.xsd">
    <id>maven-assembly-plugin-sample</id>
    <formats>
        <format>zip</format><!-- 文件类型。支持:zip;gz;tar;tar.gz;tar.bz2 -->
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory><!-- 压缩包是否包含项目本身的文件夹 -->
    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory><!-- 将项目中的文件输出到发布包的目录。这里是将resources目录下的配置文件输出到conf目录下 -->
            <outputDirectory>/conf</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/bin</directory><!-- 这里放的是执行脚本 -->
            <outputDirectory>/bin</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet><!-- 将依赖的jar输出到lib目录下 -->
            <outputDirectory>lib</outputDirectory>
            <scope>compile</scope>
        </dependencySet>
    </dependencySets>
</assembly>

再看看整个项目的结构,更加直观。

到这里,我们最基本的目标就达到了,assembly插件更多的功能可以去详细的学习。

再把一个比较通用的执行脚本也贴上,完整的sample项目可以作为简单项目的模板了。

#!/bin/bash
#设置环境变量
. /etc/profile
. ~/.bash_profile

MY_ROOT=$(cd "$(dirname "$0")"; pwd)
echo $MY_ROOT
cd $MY_ROOT

JAVA_OPTS="$JAVA_OPTS -Drun_dir=$MY_ROOT"
JAVA_OPTS="$JAVA_OPTS -Xss256k -Xms1024m -Xmx1024m -Xss256k"
JAVA_OPTS="$JAVA_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC -XX:ParallelGCThreads=16 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:CMSFullGCsBeforeCompaction=5 -XX:CMSInitiatingOccupancyFraction=80 -XX:MaxTenuringThreshold=15 "
#JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintSafepointStatistics -XX:+PrintTenuringDistribution -XX:+PrintHeapAtGC -Xloggc:./gc.log "
JAVA_OPTS="$JAVA_OPTS -Dclient.enczoding.override=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN"
JAVA_OPTS="$JAVA_OPTS -Djava.ext.dirs=../lib -Djava.library.path=../lib -cp ../conf/"

echo $JAVA_OPTS

java $JAVA_OPTS com.jihaoxian.sample.MavenAssembly $@ &

最后把整个项目的源码贴上,github地址:maven-assembly-plugin-sample


blog模板来源

该blog模板来源: http://stormzhang.github.io/