Maven打包并生成运行脚本的示例代码

时间:2022-08-31 20:05:10

1.定义插件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<properties>
        <maven-jar-plugin.version>2.4</maven-jar-plugin.version>
        <maven-assembly-plugin.version>2.4</maven-assembly-plugin.version>
        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
    </properties>
    
<plugins>
  <!-- compiler -->
    <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>
        <executions>
            <execution>
                <phase>compile</phase>
                <goals>
                    <goal>compile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <!--jar plugin -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>${maven-jar-plugin.version}</version>
        <configuration>
            <archive>
                <addMavenDescriptor>true</addMavenDescriptor>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <!--<mainClass></mainClass>-->
                </manifest>
            </archive>
            <excludes>
                <!--<exclude></exclude>-->
            </excludes>
        </configuration>
    </plugin>
    <!--assembly plugin -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>${maven-assembly-plugin.version}</version>
        <configuration>
            <descriptors>
                <descriptor>${project.basedir}/../assembly/assembly.xml</descriptor>
            </descriptors>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

2.assembly配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<assembly>
    <id>bin</id>
    <formats>
        <format>tar.gz</format>
    </formats>
 
    <dependencySets>
        <!-- runtime scope jar -->
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <unpack>false</unpack>
            <scope>runtime</scope>
        </dependencySet>
        <!-- system scope jar -->
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <unpack>false</unpack>
            <scope>system</scope>
        </dependencySet>
    </dependencySets>
 
    <fileSets>
        <!-- script -->
        <fileSet>
            <directory>${project.basedir}/../scripts</directory>
            <outputDirectory>bin</outputDirectory>
            <fileMode>0644</fileMode>
            <directoryMode>0755</directoryMode>
            <filtered>true</filtered>
        </fileSet>
        <!-- config -->
        <fileSet>
            <directory>${project.basedir}/src/main/resources</directory>
            <outputDirectory>config</outputDirectory>
            <fileMode>0644</fileMode>
            <directoryMode>0755</directoryMode>
            <includes>
                <include>*.xml</include>
                <include>*.json</include>
                <include>*.properties</include>
            </includes>
            <filtered>true</filtered>
        </fileSet>
        <!-- the project jar -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <!-- Document -->
        <fileSet>
            <directory>${project.basedir}</directory>
            <outputDirectory>doc</outputDirectory>
            <includes>
                <include>README*</include>
                <include>LICENSE*</include>
                <include>NOTICE*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

3.脚本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#!/bin/sh
#server id -- change
SERVER_ID=
#java home
JAVA_HOME=
#java command
JAVA_CMD=`which java`
#jvm option
JVM_OPT="-Xmx1024M -Xms512M -server -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
#jar name
JAR=${project.artifactId}-${project.version}.jar
#main class
MAIN_CLASS=${MainClass}
# main class args
ARGS="${StartArgs}"
#environment
ENVIRONMENT=${profiles.environment}
 
#cd working path
cd_working_path(){
  cd `dirname $0`
  cd ..
}
 
#jar
jar(){
  WK_PATH=`pwd`
  /usr/bin/nohup ${JAVA_CMD} -Denvironment=${ENVIRONMENT} -Dlog4j.configurationFile=${WK_PATH}/config/log4j2.xml ${JVM_OPT} -cp ${WK_PATH}/lib/${JAR}:${WK_PATH}/lib/* ${MAIN_CLASS} ${ARGS} >/dev/null 2>&1 &
}
 
#get pid
get_pid(){
  echo `ps -ef | grep ${JAR} | grep server_id=${SERVER_ID} |grep -v 'grep' |awk '{print $2}'`
}
 
#check
check(){
  #check server id
  if [ ! -n "$SERVER_ID" ];then
    echo "Please set up the server id 'SERVER_ID'"
    exit
  fi
}
 
#start service
start(){
  #check
  check
 
  #check pid
  PID=`get_pid`
  if [ -n "$PID" ];then
    echo "Process exists, PID >> "${PID}
    exit
  fi
 
  #check java
  if [ -n "$JAVA_HOME" ];then
    JAVA_CMD=${JAVA_HOME}/bin/java
  fi
 
  #start service
  ${JAVA_CMD} -version
  jar
 
  #check
  if [ $? -ne 0 ];then
      echo "Service startup failed."
      exit
  fi
 
  #check service
  PID=`get_pid`
  if [ ! -n "$PID" ];then
    echo "Service startup failed."
  else
    echo "Service startup success, Current environment is ${ENVIRONMENT} , PID >> "${PID}
  fi
}
 
#stop service
stop(){
  #check
  check
 
  #check pid
  PID=`get_pid`
  if [ ! -n "$PID" ];then
    echo "Process not exists."
  else
   kill ${PID}
   echo "Kill pid >> '$PID'"
    if [ $? -ne 0 ];then
      echo "Service shutdown failed."
      exit
    else
      echo "Service shutdown success."
    fi
  fi
}
 
#restart service
restart(){
  #stop service
  stop
 
  COUNT=0
  while true
  do
  PID=`get_pid`
    if [ ! -n "$PID" ];then
      #start service
      start
      break
    else
      let COUNT++
      echo "Restarting..."
       if [ ${COUNT} -eq 3 ];then
         echo "Restart error"
         exit
       fi
    fi
  sleep 3
  done
}
 
#check state
state(){
  PID=`get_pid`
 
  if [ ! -n "$PID" ];then
    echo "Service not exists."
  else
    echo "Service status is normal, PID >> '$PID'"
  fi
}
 
#main
main(){
  #cd working path
  cd_working_path
 
  if [ ! -n "$1" ];then
      echo "***********************************************"
      echo "*   start     : Start service     *"
      echo "*   stop     : Stop service      *"
      echo "*   restart    : Restart service    *"
      echo "*   state     : Check service state  *"
      echo "***********************************************"
      read -p "Please choose >> ": CASE
      PARAMETER=${CASE}
  else
    PARAMETER=$1
  fi
 
  case "$PARAMETER" in
    start)
      start
   ;;
    stop)
      stop
   ;;
    restart)
      restart
   ;;
    state)
      state
   ;;
    *)
      main
  ;;
  esac
}
 
main $1

PS:下面看下Maven打包生成可运行bat/sh脚本文件

利用Maven的appassembler-maven-plugin插件,就可以实现自动打包可运行的脚本,还可以跨平台。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.1.1</version>
    <configuration>
      <repositoryLayout>flat</repositoryLayout>
      <repositoryName>lib</repositoryName>
      <configurationSourceDirectory>src/main/resources/conf</configurationSourceDirectory>
      <!-- Set the target configuration directory to be used in the bin scripts -->
      <configurationDirectory>conf</configurationDirectory>
      <!-- Copy the contents from "/src/main/config" to the target configuration
         directory in the assembled application -->
      <copyConfigurationDirectory>true</copyConfigurationDirectory>
      <!-- Include the target configuration directory in the beginning of
         the classpath declaration in the bin scripts -->
      <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
      <!-- prefix all bin files with "mycompany" -->
      <binPrefix>startup</binPrefix>
      <!-- set alternative assemble directory -->
      <assembleDirectory>${project.build.directory}/server</assembleDirectory>
      <!-- Extra JVM arguments that will be included in the bin scripts -->
      <extraJvmArguments>-Xms768m -Xmx768m -XX:PermSize=128m
        -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m
      </extraJvmArguments>
      <!-- Generate bin scripts for windows and unix pr default -->
      <platforms>
        <platform>windows</platform>
        <platform>unix</platform>
      </platforms>
      <programs>
        <program>
          <mainClass>com.coderli.onecoder.server.HypervisorServer</mainClass>
          <name>startup</name>
        </program>
      </programs>
    </configuration>
</plugin>

然后选择要编译的工程,右键->maven build… 命令如下图:

package appassembler:assemble 

Maven打包并生成运行脚本的示例代码

然后执行run,一个可执行的脚本文件就生成好了。startup.bat是windows下的,startup.sh是linux下的

Maven打包并生成运行脚本的示例代码

总结

 

原文链接:https://blog.csdn.net/zzxjan/article/details/81205204