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,可以同时指定多个打包格式。


基本配置已经完成。推荐阅读

assembly-plugin 打包的配置Apache Maven Project


在项目根路径下使用命令

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

猜你喜欢

转载自blog.csdn.net/qq_36781718/article/details/80111971