mvn打包:依赖包和启动包分离

本文详细描述了如何使用Maven的maven-jar-plugin和maven-assembly-plugin进行项目打包,涉及目录结构、配置文件以及启动脚本service.sh,展示了如何整合依赖并生成用于发布的zip包。
摘要由CSDN通过智能技术生成

简述

  • 依赖插件:
maven-jar-plugin
maven-assembly-plugin
  • 项目目录结构
    项目目录结构示例

assembly.xml

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>assembly</id>
    <!-- 最终打包成一个用于发布的zip文件 -->
    <formats>
        <format>zip</format>
    </formats>
    <!-- Adds dependencies to zip package under lib directory -->
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <!-- 把项目的本地lib依赖 ,打包进zip文件的lib -->
        <fileSet>
            <directory>lib/</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>*</include>
            </includes>
        </fileSet>


        <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>config</outputDirectory>
            <includes>
                <include>*.yml</include>
                <include>*.yaml</include>
                <include>*.txt</include>
                <include>*.xml</include>
            </includes>
        </fileSet>


        <fileSet>
            <directory>sql</directory>
            <outputDirectory>sql</outputDirectory>
            <includes>
                <include>**</include>
            </includes>
        </fileSet>

        <fileSet>
            <!--启停脚本-->
            <directory>bin</directory>
            <outputDirectory>bin</outputDirectory>
            <directoryMode>0777</directoryMode>
            <fileMode>0777</fileMode>
            <lineEnding>unix</lineEnding>
            <includes>
                <include>*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

插件配置(启动模块POM.XML)

<!-- 部分变量 -->
<properties>
        <deploy.plugin.version>3.1.1</deploy.plugin.version>
        <assembly.plugin.version>3.6.0</assembly.plugin.version>
        <dependency.plugin.version>3.3.0</dependency.plugin.version>
        <jar.plugin.version>3.2.2</jar.plugin.version>
</properties>

<!-- ........ -->
 <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <finalName>AppName</finalName> <!--指定应用名 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire.plugin.version}</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${jar.plugin.version}</version>
                <configuration>
                    <archive>
                        <manifest>
                        <!--mainClass标签配置启动类-->
                            <mainClass>path.to.*Application</mainClass>
                            <addClasspath>true</addClasspath>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                            <addBuildEnvironmentEntries>true</addBuildEnvironmentEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${dependency.plugin.version}</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                     		<outputDirectory>${project.build.directory}/lib</outputDirectory> <!--默认输出目录在Target下-->                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>${assembly.plugin.version}</version>
                <executions>
                    <execution>
                        <id>distro-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>assembly/assembly.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
            </plugin> 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>${deploy.plugin.version}</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

结果

执行 mvn package打包

压缩包目录
在这里插入图片描述

附录

service.sh脚本

#! /bin/bash
# init app environment
export APP_HOME=`cd $(dirname $0)/..; pwd`

PIDFILE=$APP_HOME/app.pid


# set java main class
MAIN_CLASS="path.to.*Application"

# set class path config and jar package
CLASSPATH=${CLASSPATH}:${APP_HOME}/config
CLASSPATH=${CLASSPATH}:${APP_HOME}/lib/*

# init java environment
export JAVA=$(which java)
if [ -z "$JAVA" ] ; then
  echo "no java environment ... "
  exit 1;
fi

# set java opt
JAVA_OPT=" ${JAVA_OPT} -cp ${CLASSPATH}"
JAVA_OPT=" ${JAVA_OPT} -XX:+UseConcMarkSweepGC"
JAVA_OPT=" ${JAVA_OPT} -XX:CMSInitiatingOccupancyFraction=75"
#JAVA_OPT=" ${JAVA_OPT} -XX:+UseCMSInitiatingOccupancyOnly"
#JAVA_OPT=" ${JAVA_OPT} -Dlog4j2.formatMsgNoLookups=true"
JAVA_OPT=" ${JAVA_OPT} -Dapp.home=${APP_HOME}"
#JAVA_OPT=" ${JAVA_OPT} -Dfastjson.parser.safeMode=true"
JAVA_OPT=" ${JAVA_OPT} ${MAIN_CLASS}"


check_process_file() {
  if [ -f $PIDFILE ]
  then
    PID=$(cat $PIDFILE)
    ps -p $PID > /dev/null 2>&1
    if [ $? -eq 0 ]
    then
      echo "Process already running"
      exit 1
    fi
  fi
}

start() {
  # shell method
  cd $APP_HOME
  echo "starting program ... "
  echo "$JAVA ${JAVA_OPT}"
  nohup $JAVA ${JAVA_OPT} > /dev/null 2>&1 &
  check_process_file
  if [ $? -eq 0 ] ; then
    if echo -n $! > "$PIDFILE" ; then
      	PID=$(cat $PIDFILE)
      	echo "The program[$PID] launch succeed"
    else
        exit 1
    fi
  else
    exit 1
  fi
}

stop() {
  echo "Stopping program ... "
  if [ ! -f "$PIDFILE" ]
  then
    echo "No program to stop (could not find file $PIDFILE)"
  else
    PID=$(cat "$PIDFILE")
    kill -15  $PID
    while [ 0 -ne $(ps | awk '{print $1}' | grep -v -i "pid" | grep $PID | wc -l) ]
    do
      echo -e ".\c"
      sleep 1s
    done
    rm "$PIDFILE"
    echo "The program[$PID] is stopped"
  fi
}

if [ "$1" = "stop" ]; then
  stop
elif [ "$1" = "start" ]; then
  start
elif [ "$1" = "restart" ]; then
  echo "restart..."
  stop
  start
else
  echo "Usage [start|stop|restart]"
fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值