美文网首页
maven插件assembly使用

maven插件assembly使用

作者: 吴世浩 | 来源:发表于2017-10-15 22:04 被阅读67次

    一:、好言

    偶尔对自己好些,偷个小懒,抽点小疯,花点小钱,不算伤天害理。

    二、内容

    2.1:在看dubbo的demo的时候,我们会发现在打包的时候用到assembly插件来做操作,并且会把相应的命令打入,解压后可以直接运行sh来启动dubbo.所以想自己尝试配置然后跑一跑试试。

    2.2:配置

    img_1.png

    先看看项目简单的模块。
    只说配置吧,先看看provider的配置
    资源放在src/main/resources/META-INF/spring/*下

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="demo-provider"/>
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <dubbo:protocol name="dubbo" port="20880"/>
        <bean id="userService" class="com.mouse.moon.provide.UserServiceImpl"></bean>
        <dubbo:service ref="userService" interface="com.mouse.moon.facade.UserFacade"></dubbo:service>
    
    </beans>
    
    图片.png

    assembly.xml配置:

    <assembly>
        <id>assembly</id>
        <formats>
            <format>tar.gz</format>
        </formats>
        <includeBaseDirectory>true</includeBaseDirectory>
        <fileSets>
            <fileSet>
                <directory>src/main/resources/META-INF/spring/bin</directory>
                <outputDirectory>/bin</outputDirectory>
            </fileSet>
            <fileSet>
                <directory>src/main/assembly/conf</directory>
                <outputDirectory>conf</outputDirectory>
            </fileSet>
        </fileSets>
        <dependencySets>
            <dependencySet>
                <outputDirectory>lib</outputDirectory>
            </dependencySet>
        </dependencySets>
    </assembly>
    

    其实我们看一搬配置里面会加个熟悉

    <fileMode>0755</fileMode>
    

    我的现在没配置的原因是因为我配置这个之后,打包解压后的start.sh是不可执行的,然后去掉之后是好的,个人认为可能是跟电脑权限有关,我的mac下配置是需要去掉该属性。

    pom文件配置:

     <build>
            <plugins>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4.1</version>
                    <executions>
                        <execution>
                            <id>make-zip</id>
                            <!-- 绑定到package生命周期阶段上 -->
                            <phase>package</phase>
                            <goals>
                                <!-- 绑定到package生命周期阶段上 -->
                                <goal>single</goal>
                            </goals>
                            <configuration>
                                <descriptors> <!--描述文件路径-->
                                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                                </descriptors>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    打完包可以看到生存一个*.tar.gz的包


    图片.png

    解压后可以看到三个文件

    图片.png

    进入bin目录,执行start.sh

    图片.png

    遇到问题:这里我启动的时候本身是报异常的
    ERROR: The demo-provide already started!
    这个看了看start.sh里面的写法如下:

    PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
    if [ -n "$PIDS" ]; then
        echo "ERROR: The $SERVER_NAME already started!"
        echo "PID: $PIDS"
        exit 1
    fi
    

    这里竟然是按照路径来查找进程是否存在的,这个你随便写个不存在的路径也能查找到pid,这个pid就是本身这次查找的。
    然后stop:

    图片.png

    我的这个项目遇到这个问题后,我把项目打包给朋友测试,在他的电脑就可以成功,所以我很纳闷。最后才发现是我的终端问题,这里竟然会出现终端这个ps自己的进程

    图片.png

    后面我在网上找了一个启动程序,然后用这个命令竟然是可以启动的
    这个参考文章

    #!/bin/bash  
    cd `dirname $0`  
      
    #当前路径  
    BIN_DIR=`pwd`  
      
    #向上一层路径  
    cd ..  
    DEPLOY_DIR=`pwd`  
    echo $DEPLOY_DIR  
      
    #配置文件路径  
    CONF_DIR=$DEPLOY_DIR/conf  
    #日志输出路径  
    LOGS_DIR=$DEPLOY_DIR/logs  
      
    # 如果JDK环境变量没有写到全局要添加如下几行  
    # JAVA_HOME=/opt/java/jdk1.6.0_45  
    # PATH=$JAVA_HOME/bin:$PATH  
    # export JAVA_HOME  
    # export PATH  
      
    #从dubbo.properties取得应用名、端口号,端口名  
    SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
    SERVER_PROTOCOL_NAME=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
    SERVER_PROTOCOL_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
      
    #应用名为空的话就取当前系统名  
    if [ -z "$SERVER_NAME" ]; then  
        echo "SERVER_NAME is empty"  
        SERVER_NAME=`hostname`  
    fi  
      
    #根据配置文件路径去查找当前是否已有dubbo应用启动起来  
    APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
    echo "SERVER_NAME: $SERVER_NAME"  
    echo "SERVER_PROTOCOL_NAME: $SERVER_PROTOCOL_NAME"  
    echo "SERVER_PROTOCOL_PORT: $SERVER_PROTOCOL_PORT"  
    echo "APP_PID: $APP_PID"   
      
    #APP_PID不为空,说明应用已启动,直接退出  
    if [ -n "$APP_PID" ]; then  
        echo "ERROR: The $SERVER_NAME already started!"  
        echo "PID: $APP_PID"  
        exit 1  
    fi  
      
    #检查端口是否被占用  
    if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
        SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PROTOCOL_PORT | wc -l`  
        if [ $SERVER_PORT_COUNT -gt 0 ]; then  
            echo "ERROR: The $SERVER_NAME port $SERVER_PROTOCOL_PORT already used!"  
            exit 1  
        fi  
    fi  
      
      
    #如果logs目录不存在,就创建一个  
    if [ ! -d $LOGS_DIR ]; then  
        mkdir $LOGS_DIR  
    fi  
      
    echo "LOGS_DIR :$LOGS_DIR"  
      
    #控制台日志输出收集位置  
    STDOUT_FILE=$LOGS_DIR/stdout.log  
      
    #依赖jar包目录  
    LIB_DIR=$DEPLOY_DIR/lib  
      
    #将上面的jar文件名称,拼接上lib的路径然后输出  
    LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`  
      
    #-DappName指定应用名  
    JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true"  
      
    #调试模式  
    JAVA_DEBUG_OPTS=""  
    if [ "$1" = "debug" ]; then  
        JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "  
    fi  
    JAVA_JMX_OPTS=""  
    if [ "$1" = "jmx" ]; then  
        JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "  
    fi  
      
      
    #首先将java版本号信息输出到标准输出,然后查找’64-bit’信息,目的就是判断jdk版本是否为64位  
      
    JAVA_MEM_OPTS=""  
    BITS=`java -version 2>&1 | grep -i 64-bit`  
      
    #JVM启动基本参数,这里根据应用自行调整  
    JAVA_MEM_SIZE_OPTS="-Xmx768m -Xms378m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=256M -Xss256k"  
      
    #根据32位和64位配置不同的启动java垃圾回收参数,根据应用自行调整  
    if [ -n "$BITS" ]; then  
        JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "  
    else  
        JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "  
    fi  
      
    echo -e "Starting the $SERVER_NAME ...\c"  
    echo "启动参数:java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $JAVA_PROPERTIES_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main"  
      
    #通过java命令启动服务,同时将其作为后台任务执行。  
    nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 &  
      
    #睡眠一下再检查应用是否启动,下面这里注释打开的话,就把最下面的那一段注释掉  
    #sleep 1  
    #APP_PID=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`  
      
    #if [ -z "$APP_PID" ]; then  
        #echo "START APP FAIL!"  
        #echo "STDOUT: $STDOUT_FILE"  
        #exit 1  
    #fi  
      
    #echo "START  SUCCESSED APP_PID: $APP_PID"  
    #echo "STDOUT: $STDOUT_FILE"  
      
      
    #grep -c 阻止正常的结果输出,转而输出匹配的结果数量,这里就是输出OK的个数。  
    COUNT=0  
    while [ $COUNT -lt 1 ]; do      
        echo -e ".\c"  
        sleep 1  
        if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
            if [ "$SERVER_PROTOCOL_NAME" == "dubbo" ]; then  
                COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PROTOCOL_PORT | grep -c OK`  
            else  
                COUNT=`netstat -an | grep $SERVER_PROTOCOL_PORT | wc -l`  
            fi  
        else  
            COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`  
        fi  
        if [ $COUNT -gt 0 ]; then  
            break  
        fi  
    done  
    echo "OK!"  
    APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
    echo "START  SUCCESSED APP_PID: $APP_PID"  
    echo "STDOUT: $STDOUT_FILE"  
    

    停止脚本:

    #!/bin/bash  
    cd `dirname $0`  
      
    #当前路径  
    BIN_DIR=`pwd`  
      
    #向上一层路径  
    cd ..  
    DEPLOY_DIR=`pwd`  
    echo $DEPLOY_DIR  
      
    #配置文件路径  
    CONF_DIR=$DEPLOY_DIR/conf  
    #日志输出路径  
    LOGS_DIR=$DEPLOY_DIR/logs  
      
    # 如果JDK环境变量没有写到全局要添加如下几行  
    # JAVA_HOME=/opt/java/jdk1.6.0_45  
    # PATH=$JAVA_HOME/bin:$PATH  
    # export JAVA_HOME  
    # export PATH  
      
    #从dubbo.properties取得应用名、端口号,端口名  
    SERVER_NAME=`sed '/dubbo.application.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
    SERVER_PROTOCOL_NAME=`sed '/dubbo.protocol.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
    SERVER_PROTOCOL_PORT=`sed '/dubbo.protocol.port/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
      
    #应用名为空的话就取当前系统名  
    if [ -z "$SERVER_NAME" ]; then  
        echo "SERVER_NAME is empty"  
        SERVER_NAME=`hostname`  
    fi  
      
    #根据配置文件路径去查找当前是否已有dubbo应用启动起来  
    APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
    echo "SERVER_NAME: $SERVER_NAME"  
    echo "SERVER_PROTOCOL_NAME: $SERVER_PROTOCOL_NAME"  
    echo "SERVER_PROTOCOL_PORT: $SERVER_PROTOCOL_PORT"  
    echo "APP_PID: $APP_PID"   
      
    #APP_PID不为空,说明应用已启动,直接退出  
    if [ -n "$APP_PID" ]; then  
        echo "ERROR: The $SERVER_NAME already started!"  
        echo "PID: $APP_PID"  
        exit 1  
    fi  
      
    #检查端口是否被占用  
    if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
        SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PROTOCOL_PORT | wc -l`  
        if [ $SERVER_PORT_COUNT -gt 0 ]; then  
            echo "ERROR: The $SERVER_NAME port $SERVER_PROTOCOL_PORT already used!"  
            exit 1  
        fi  
    fi  
      
      
    #如果logs目录不存在,就创建一个  
    if [ ! -d $LOGS_DIR ]; then  
        mkdir $LOGS_DIR  
    fi  
      
    echo "LOGS_DIR :$LOGS_DIR"  
      
    #控制台日志输出收集位置  
    STDOUT_FILE=$LOGS_DIR/stdout.log  
      
    #依赖jar包目录  
    LIB_DIR=$DEPLOY_DIR/lib  
      
    #将上面的jar文件名称,拼接上lib的路径然后输出  
    LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`  
      
    #-DappName指定应用名  
    JAVA_OPTS="-DappName=$SERVER_NAME -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Ddubbo.shutdown.hook=true"  
      
    #调试模式  
    JAVA_DEBUG_OPTS=""  
    if [ "$1" = "debug" ]; then  
        JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "  
    fi  
    JAVA_JMX_OPTS=""  
    if [ "$1" = "jmx" ]; then  
        JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "  
    fi  
      
      
    #首先将java版本号信息输出到标准输出,然后查找’64-bit’信息,目的就是判断jdk版本是否为64位  
      
    JAVA_MEM_OPTS=""  
    BITS=`java -version 2>&1 | grep -i 64-bit`  
      
    #JVM启动基本参数,这里根据应用自行调整  
    JAVA_MEM_SIZE_OPTS="-Xmx768m -Xms378m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=256M -Xss256k"  
      
    #根据32位和64位配置不同的启动java垃圾回收参数,根据应用自行调整  
    if [ -n "$BITS" ]; then  
        JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "  
    else  
        JAVA_MEM_OPTS=" -server $JAVA_MEM_SIZE_OPTS -XX:SurvivorRatio=2 -XX:+UseParallelGC "  
    fi  
      
    echo -e "Starting the $SERVER_NAME ...\c"  
    echo "启动参数:java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $JAVA_PROPERTIES_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main"  
      
    #通过java命令启动服务,同时将其作为后台任务执行。  
    nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 &  
      
    #睡眠一下再检查应用是否启动,下面这里注释打开的话,就把最下面的那一段注释掉  
    #sleep 1  
    #APP_PID=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`  
      
    #if [ -z "$APP_PID" ]; then  
        #echo "START APP FAIL!"  
        #echo "STDOUT: $STDOUT_FILE"  
        #exit 1  
    #fi  
      
    #echo "START  SUCCESSED APP_PID: $APP_PID"  
    #echo "STDOUT: $STDOUT_FILE"  
      
      
    #grep -c 阻止正常的结果输出,转而输出匹配的结果数量,这里就是输出OK的个数。  
    COUNT=0  
    while [ $COUNT -lt 1 ]; do      
        echo -e ".\c"  
        sleep 1  
        if [ -n "$SERVER_PROTOCOL_PORT" ]; then  
            if [ "$SERVER_PROTOCOL_NAME" == "dubbo" ]; then  
                COUNT=`echo status | nc -i 1 127.0.0.1 $SERVER_PROTOCOL_PORT | grep -c OK`  
            else  
                COUNT=`netstat -an | grep $SERVER_PROTOCOL_PORT | wc -l`  
            fi  
        else  
            COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`  
        fi  
        if [ $COUNT -gt 0 ]; then  
            break  
        fi  
    done  
    echo "OK!"  
    APP_PID=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
    echo "START  SUCCESSED APP_PID: $APP_PID"  
    echo "STDOUT: $STDOUT_FILE"  
    

    sh stop.sh dump

        #!/bin/bash  
    cd `dirname $0`  
    BIN_DIR=`pwd`  
    cd ..  
    DEPLOY_DIR=`pwd`  
    CONF_DIR=$DEPLOY_DIR/conf  
      
    # 如果JDK环境变量没有写到全局要添加如下几行  
    # JAVA_HOME=/opt/java/jdk1.6.0_45  
    # PATH=$JAVA_HOME/bin:$PATH  
    # export JAVA_HOME  
    # export PATH  
      
    SERVER_NAME=`sed '/^app.process.name/!d;s/.*=//' conf/dubbo.properties | tr -d '\r'`  
      
    if [ -z "$SERVER_NAME" ]; then  
        SERVER_NAME=`hostname`  
    fi  
      
    PIDS=`ps -ef -ww | grep "java" | grep " -DappName=$SERVER_NAME " | awk '{print $2}'`  
    if [ -z "$PIDS" ]; then  
        echo "ERROR: The $SERVER_NAME does not started!"  
        exit 1  
    fi  
      
    LOGS_DIR=$DEPLOY_DIR/logs  
    if [ ! -d "$LOGS_DIR" ]; then  
        mkdir -p "$LOGS_DIR"  
    fi  
    DUMP_DIR=$LOGS_DIR/dump  
    if [ ! -d $DUMP_DIR ]; then  
        mkdir $DUMP_DIR  
    fi  
    DUMP_DATE=`date +%Y%m%d%H%M%S`  
    DATE_DIR=$DUMP_DIR/$DUMP_DATE  
    if [ ! -d $DATE_DIR ]; then  
        mkdir $DATE_DIR  
    fi  
      
    echo -e "Dumping the $SERVER_NAME ...\c"  
    for PID in $PIDS ; do  
        jstack $PID > $DATE_DIR/jstack-$PID.dump 2>&1  
        echo -e ".\c"  
        jinfo $PID > $DATE_DIR/jinfo-$PID.dump 2>&1  
        echo -e ".\c"  
        jstat -gcutil $PID > $DATE_DIR/jstat-gcutil-$PID.dump 2>&1  
        echo -e ".\c"  
        jstat -gccapacity $PID > $DATE_DIR/jstat-gccapacity-$PID.dump 2>&1  
        echo -e ".\c"  
        jmap $PID > $DATE_DIR/jmap-$PID.dump 2>&1  
        echo -e ".\c"  
        jmap -heap $PID > $DATE_DIR/jmap-heap-$PID.dump 2>&1  
        echo -e ".\c"  
        jmap -histo $PID > $DATE_DIR/jmap-histo-$PID.dump 2>&1  
        echo -e ".\c"  
        if [ -r /usr/sbin/lsof ]; then  
        /usr/sbin/lsof -p $PID > $DATE_DIR/lsof-$PID.dump  
        echo -e ".\c"  
        fi  
    done  
      
    if [ -r /bin/netstat ]; then  
    /bin/netstat -an > $DATE_DIR/netstat.dump 2>&1  
    echo -e ".\c"  
    fi  
    if [ -r /usr/bin/iostat ]; then  
    /usr/bin/iostat > $DATE_DIR/iostat.dump 2>&1  
    echo -e ".\c"  
    fi  
    if [ -r /usr/bin/mpstat ]; then  
    /usr/bin/mpstat > $DATE_DIR/mpstat.dump 2>&1  
    echo -e ".\c"  
    fi  
    if [ -r /usr/bin/vmstat ]; then  
    /usr/bin/vmstat > $DATE_DIR/vmstat.dump 2>&1  
    echo -e ".\c"  
    fi  
    if [ -r /usr/bin/free ]; then  
    /usr/bin/free -t > $DATE_DIR/free.dump 2>&1  
    echo -e ".\c"  
    fi  
    if [ -r /usr/bin/sar ]; then  
    /usr/bin/sar > $DATE_DIR/sar.dump 2>&1  
    echo -e ".\c"  
    fi  
    if [ -r /usr/bin/uptime ]; then  
    /usr/bin/uptime > $DATE_DIR/uptime.dump 2>&1  
    echo -e ".\c"  
    fi  
      
    echo "OK!"  
    echo "DUMP: $DATE_DI
    

    相关文章

      网友评论

          本文标题:maven插件assembly使用

          本文链接:https://www.haomeiwen.com/subject/oxwcuxtx.html