1. 程式人生 > >Maven 使用maven-assembly-plugin將依賴包一塊打包

Maven 使用maven-assembly-plugin將依賴包一塊打包

對於菜鳥來說,maven也是一座大山。在IDEA中執行package命令後,打出的包是不帶依賴包的。

加入依賴包的話,首先看下目錄結構(這個目錄結構可以修改,不是絕對的)


首先在pom檔案plugins節點下加入

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
<manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>執行的主類全限定路徑</mainClass> <useUniqueVersions>false</useUniqueVersions> </manifest>
</archive> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptor>src/main/assembly/assembly.xml</descriptor> </configuration> <executions> <execution>
<id>make-assembly</id> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>

不建議使用

<descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs>

雖然是官方提供的定製化打包方式。
建議使用<descriptor>來打包。

而assembly.xml的內容是

<assembly>
    <id>assembly</id> <!--字尾名 如${artifactId}-${id}.tar.gz-->
<formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/main/bin</directory>
            <outputDirectory>bin</outputDirectory> <!--根據上面指定的目錄,將指定檔案打到該bin目錄下,主要是啟動指令碼 -->
<fileMode>0755</fileMode> <!--指定檔案屬性,使用八進位制表達,分別為(User)(Group)(Other)所屬屬性,預設為 0644-->
</fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory> <!--預設的jar都在lib裡-->
</dependencySet>
    </dependencySets>
</assembly>

<format>標籤

maven-assembly-plugin 支援的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,可以同時指定多個打包格式。

基本配置已經完成。推薦閱讀

在專案根路徑下使用命令

mvn assembly:assembly -Dmaven.test.skip=true

打出的包結構為


lib下:


bin下:


而啟動指令碼:

start.sh:

#!/bin/bash
cd `dirname $0`
cd ../lib
LIB_DIR=`pwd`

SERVER_NAME='啟動主類全限定名'
PIDS=`ps -ef | grep java | grep "$LIB_DIR" |grep $SERVER_NAME|awk '{print $2}'`
if [ -n "$PIDS" ]; then
    echo "start fail! The $SERVER_NAME already started!"
    exit 1
fi


LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`
cd ..
nohup java -Djava.net.preferIPv4Stack=true -server -Xms1g -Xmx1g -XX:PermSize=128m  -classpath $LIB_JARS $SERVER_NAME 1>/dev/null 2>&1 &
echo "start "$SERVER_NAME" success!"

nohup命令是後臺啟動,不然會佔用啟動視窗不能關閉。

stop.sh:

#!/bin/bash
PWD=`pwd`
cd `dirname $0`
cd ../lib
LIB_DIR=`pwd`

SERVER_NAME='啟動主類全限定名'
PIDS=`ps -ef | grep java | grep "$LIB_DIR" |grep $SERVER_NAME|awk '{print $2}'`
if [ -z "$PIDS" ]; then
    echo "stop fail! The $SERVER_NAME not start!"
    exit 1
fi

for PID in $PIDS ;
do
    kill $PID > /dev/null 2>&1
done
echo "stop success! pid:"$PIDS
cd $PWD