maven程序集插件提供了一种描述符格式,允许您定义项目中文件和目录的任意程序集。例如,如果Maven项目包含目录“src/main/bin”,则可以指示程序集插件将此目录的内容复制到程序集的“bin”目录,并将“bin”目录中文件的权限更改为UNIX模式755。配置此行为的参数通过程序集描述符提供给程序集插件。
目前,它可以创建以下格式的发行版:
我们平时在开发过程中的项目目录结构是这样的:
在用maven进行打包后,希望得到的目录是这样的
bin: 启动脚本
conf: 配置信息
lib:用的jar包
logs:所有日志信息
输出的格式为 tar.gz 在assembly.xml中可以这样配置:
<assembly> <id>assembly</id> <!-- 输出格式 --> <formats> <format>tar.gz</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <!-- 指定文件组的组装方式 --> <fileSets> <!-- 将项目中src/main/bin目录下的脚本文件copy到target目录的bin目录下 --> <fileSet> <directory>src/main/assembly/bin</directory> <outputDirectory>bin</outputDirectory> <!-- 0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限; 0644->即用户具有读写权限,组用户和其它用户具有只读权限; --> <fileMode>0755</fileMode> </fileSet> <!-- 将项目中src/main/resources目录下的资源文件copy到target目录的conf目录下 --> <fileSet> <directory>src/main/resources</directory> <outputDirectory>conf</outputDirectory> <fileMode>0644</fileMode> </fileSet> <!-- 将项目中src/main/resources目录下的日志文件copy到target目录的logs目录下 --> <fileSet> <directory>src/main/resources</directory> <outputDirectory>logs</outputDirectory> <fileMode>0755</fileMode> <excludes> <exclude>**/*</exclude> </excludes> </fileSet> <!-- 将项目中target目录下的包含jar的文件copy到lib目录下 --> <fileSet> <directory>target</directory> <outputDirectory>lib</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> </fileSets> </assembly>
如果想把一些依赖库打到包里,可以用 dependencySets 元素,定义依赖包打包到目录下
<!-- 指定依赖jar包输出的目录 --> <dependencySets> <dependencySet> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> <!-- 只包含runtime作用域的依赖 --> <scope>runtime</scope> </dependencySet> </dependencySets>
排除文件,在fileSet里可以使用includes 和 excludes来更精确的控制哪些文件要添加,哪些文件要排除。
例如要排除某个目录下所有的txt文件:
<fileSet> <directory>target/classes</directory> <outputDirectory>/</outputDirectory> <excludes> <exclude>**/*.txt</exclude> </excludes> </fileSet>
在pom文件中进行添加maven-assembly-plugin插件来定制化打包
<build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <executable>true</executable> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- 编码和编译和JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <!--添加打包插件声明 --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> </configuration> <!--执行器 mvn assembly:assembly--> <executions> <execution> <!--名字任意 --> <id>make-assembly</id> <!-- 绑定到package生命周期阶段上 --> <phase>package</phase> <!-- 只运行一次 --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
startup.bat 启动脚本
@echo off set APP_NAME=zhaixingzu.jar set CONFIG= -Dlogging.path=../logs -Dspring.config.location=../conf/application.yml set DEBUG_OPTS= if ""%1"" == ""debug"" ( set DEBUG_OPTS= -Xloggc:../logs/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs goto debug ) set JMX_OPTS= if ""%1"" == ""jmx"" ( set JMX_OPTS= -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9888 -Dcom.sun.management.jmxremote.ssl=FALSE -Dcom.sun.management.jmxremote.authenticate=FALSE goto jmx ) echo "Starting the %APP_NAME%" java -Xms512m -Xmx512m -server %DEBUG_OPTS% %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME% goto end :debug echo "debug" java -Xms512m -Xmx512m -server %DEBUG_OPTS% %CONFIG% -jar ../lib/%APP_NAME% goto end :jmx java -Xms512m -Xmx512m -server %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME% goto end :end pause
startup.sh 启动脚本
#!/bin/bash SERVER_NAME='zhaixingzu' JAR_NAME="$SERVER_NAME.jar" cd `dirname $0` BIN_DIR=`pwd` cd .. DEPLOY_DIR=`pwd` CONF_DIR=$DEPLOY_DIR/conf #SERVER_PORT=`sed -nr '/port: [0-9]+/ s/.*port: +([0-9]+).*/1/p' conf/application.yml` SERVER_PORT='8082' PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'` if [ "$1" = "status" ]; then if [ -n "$PIDS" ]; then echo "The $SERVER_NAME is running...!" echo "PID: $PIDS" exit 0 else echo "The $SERVER_NAME is stopped" exit 0 fi fi if [ -n "$PIDS" ]; then echo "ERROR: The $SERVER_NAME already started!" echo "PID: $PIDS" exit 1 fi if [ -n "$SERVER_PORT" ]; then SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l` if [ $SERVER_PORT_COUNT -gt 0 ]; then echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!" exit 1 fi fi LOGS_DIR=$DEPLOY_DIR/logs if [ ! -d $LOGS_DIR ]; then mkdir $LOGS_DIR fi STDOUT_FILE=$LOGS_DIR/stdout.log JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=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_MEM_OPTS="" BITS=`java -version 2>&1 | grep -i 64-bit` if [ -n "$BITS" ]; then JAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 " else JAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC " fi CONFIG_FILES=" -Dlogging.path=$LOGS_DIR -Dspring.config.location=$CONF_DIR/application.yml " echo -e "Starting the $SERVER_NAME ..." nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/lib/$JAR_NAME > $STDOUT_FILE 2>&1 & COUNT=0 while [ $COUNT -lt 1 ]; do echo -e ".c" sleep 1 if [ -n "$SERVER_PORT" ]; then COUNT=`netstat -an | grep $SERVER_PORT | wc -l` 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!" PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'` echo "PID: $PIDS" echo "STDOUT: $STDOUT_FILE"