jfinal-4.2 前后台端分离打包方式
[概述]
1.jfinal有很多种打包方式,这里不是唯一的打包方式
2.我的打包方式是为了配合nginx整合加载静态文件
[原则]
1.项目必须具有工程名,方便nginx转发
2.使用一个域名+多个多个工程名的方式区别不同的项目
例如
http://xxx/robot nginx转发的到robot服务,robot服务是单独的jfinal工程
http://xxx/ask nginx转发转发ask服务,ask服务是单独的jfinal工程
搭建工程
创建maven工程,工程名是 jfinal-4.2-web
pom.xml内容如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.uairobot.bill</groupId>
<artifactId>jfinal-4.2-web</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<includes>
<include>com/**</include>
<include>cn/**</include>
</includes>
<excludes>
<exclude>*.txt</exclude>
<exclude>*.xml</exclude>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>pre-integration-test</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<!-- jar 等压缩文件在被打包进入 zip、tar.gz 时是否压缩,设置为 false 可加快打包速度 -->
<recompressZippedFiles>false</recompressZippedFiles>
<!-- 打包生成的文件是否要追加 release.xml 中定义的 id 值 -->
<appendAssemblyId>true</appendAssemblyId>
<!-- 指向打包描述文件 package.xml -->
<descriptors>
<descriptor>src/main/assembly/package.xml</descriptor>
</descriptors>
<!-- 打包结果输出的基础目录 -->
<outputDirectory>${project.build.directory}/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--桥接器:告诉slf4j使用Log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependencies>
</project>
pom.xml中的maven-assembly-plugin使用src/main/assembly/package.xml文件
package.xml
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<!-- assembly 打包配置更多配置可参考官司方文档: http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html -->
<id>release</id>
<!-- 设置打包格式 tar.g在linux上可以解压,在windows上也可以-->
<formats>
<format>tar.gz</format>
</formats>
<!-- 打 zip 设置为 true 时,会在 zip 包中生成一个根目录,打 dir 时设置为 false 少层目录 -->
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- src/main/resources 配置文件 copy 到 config 目录下 -->
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>config</outputDirectory>
<includes>
<include>log4j2.xml</include>
<include>undertow.properties</include>
</includes>
</fileSet>
<!-- 复制sql文件到config目录下 -->
<fileSet>
<directory>${basedir}/src/main/resources/sql</directory>
<outputDirectory>config/sql</outputDirectory>
</fileSet>
<!--复制静态文件 -->
<fileSet>
<directory>${basedir}/src/main/resources/${artifactId}</directory>
<outputDirectory>static/${artifactId}</outputDirectory>
</fileSet>
<!-- 复制service文件 -->
<fileSet>
<directory>${basedir}/src/main/bin</directory>
<lineEnding>unix</lineEnding>
<outputDirectory>service</outputDirectory>
<!-- 脚本文件在 linux 下的权限设为 755,无需 chmod 可直接运行 -->
<fileMode>755</fileMode>
<includes>
<include>*.service</include>
</includes>
</fileSet>
<!-- 项目根下面的脚本文件 copy 到根目录下 -->
<fileSet>
<directory>${basedir}/src/main/bin</directory>
<lineEnding>unix</lineEnding>
<outputDirectory></outputDirectory>
<!-- 脚本文件在 linux 下的权限设为 755,无需 chmod 可直接运行 -->
<fileMode>755</fileMode>
<includes>
<include>*.sh</include>
</includes>
</fileSet>
<fileSet>
<directory>${basedir}/src/main/bin</directory>
<lineEnding>windows</lineEnding>
<outputDirectory></outputDirectory>
<includes>
<include>*.bat</include>
</includes>
</fileSet>
</fileSets>
<!-- 依赖的 jar 包 copy 到 lib 目录下 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>packege中的将${basedir}/src/main/resources/${artifactId} 复制到static/${artifactId}目录下面
将src/main/resources下面创建和工程名同名的文件夹存放静态文件
将*.sh *.bat文件复制到了工程根目录下 因为无不在windows上启动所以没有添加*.bat文件
将*.service文件 复制到了工程根目录下的service目录下
工程目录结构

undertow.properties,主要是配置工程名和静态目录
undertow.devMode=true undertow.port=11023 undertow.host=0.0.0.0 undertow.contextPath=/jfinal-4.2-web undertow.resourcePath = classpath:jfinal-4.2-web #jdbc-mysql jdbc.url=jdbc:mysql://localhost/jfinal_42_web jdbc.user=root jdbc.pswd=
jfinal.sh 启动脚本的内容
主要工程
1,获取程序启动目录
2.生成完整的程序启动命令
3.启动程序
#!/bin/sh
# chkconfig: 345 99 01
# description:jfinal
##########################
# get app home start
###########################
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
##########################
# get app home end
###########################
##########################
# custom variables start
###########################
JAVA_HOME=/usr/java/jdk1.8.0_211
APP_HOME=`dirname "$PRG"`
APP_NAME=`basename "$PRG"`
PID_FILE=$APP_HOME/$APP_NAME.pid
CP=$APP_HOME/boot/*:$APP_HOME/lib/*:$APP_HOME/config:$APP_HOME/static
# 启动入口类,该脚本文件用于别的项目时要改这里
MAIN_CLASS=com.litong.jfinal.Application
# Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格
# JAVA_OPTS="-Xms256m -Xmx1024m -Dundertow.port=80 -Dundertow.host=0.0.0.0"
# JAVA_OPTS="-Dundertow.port=80 -Dundertow.host=0.0.0.0"
CMD="$JAVA_HOME/bin/java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS}"
###########################
# custom variables end
###########################
source /etc/init.d/functions
#########################
# define funcation start
##########################
if [[ "$MAIN_CLASS" == "com.yourpackage.YourMainClass" ]]; then
echo "请先修改 MAIN_CLASS 的值为你自己项目启动Class,然后再执行此脚本。"
exit 0
fi
lock_dir=/var/lock/subsys
lock_file=$lock_dir/$APP_NAME
createLockFile(){
[ -w $lock_dir ] && touch $lock_file
}
start(){
[ -e $APP_HOME/logs ] || mkdir $APP_HOME/logs -p
if [ -f $PID_FILE ]
then
echo 'alread running...'
else
echo $CMD
nohup $CMD >> $APP_HOME/logs/$APP_NAME.log 2>&1 &
echo $! > $PID_FILE
createLockFile
echo_success
fi
}
stop(){
if [ -f $PID_FILE ]
then
killproc -p $PID_FILE
rm -f $PID_FILE
echo_success
else
echo 'not running...'
fi
}
restart(){
stop
start
}
status(){
cat $PID_FILE
}
##########################
# define function end
##########################
ACTION=$1
case $ACTION in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo usage "{start|stop|restart|status}"
;;
esacjfinal-4.2-web.service 服务配置文件,用于在centos-7上设置开机自启
[Unit] Description=ip After=network.target [Service] ExecStart=/opt/jfinal/jfinal-4.2-web/jfinal.sh start ExecStop=/opt/jfinal/jfinal-4.2-web/jfinal.sh stop ExecReload=/opt/jfinal/jfinal-4.2-web/jfinal.sh restart Type=forking PrivateTmp=true [Install] WantedBy=multi-user.target
启动类就是正常的启动类
执行打包命令
clean pre-integration-test -DskipTests

打包完后生成的文件是jfinal-4.2-web-1.0-release.tar.gz上传到linux服务器上的/opt/package下,解压到/opt/jfinal/目录下
tar -xf /opt/package/jfinal-4.2-web-1.0-release.tar.gz -C /opt/jfinal/
解压的程序目录结构如下
# tree /opt/jfinal/jfinal-4.2-web-1.0/ /opt/jfinal/jfinal-4.2-web-1.0/ ├── config │ ├── log4j2.xml │ └── undertow.properties ├── jfinal.sh ├── lib │ ├── javax.servlet-api-4.0.1.jar │ ├── jboss-logging-3.3.2.Final.jar │ ├── jfinal-4.2.jar │ ├── jfinal-4.2-web-1.0.jar │ ├── jfinal-undertow-1.6.jar │ ├── log4j-api-2.1.jar │ ├── log4j-core-2.1.jar │ ├── log4j-slf4j-impl-2.1.jar │ ├── slf4j-api-1.7.25.jar │ ├── undertow-core-2.0.19.Final.jar │ ├── undertow-servlet-2.0.19.Final.jar │ ├── xnio-api-3.3.8.Final.jar │ └── xnio-nio-3.3.8.Final.jar ├── service │ └── jfinal-4.2-web.service └── static └── jfinal-4.2-web └── index.html
启动程序
# /opt/jfinal/jfinal-4.2-web-1.0/jfinal.sh start
最终执行的系统命令是
/usr/java/jdk1.8.0_211/bin/java -Xverify:none -cp /opt/jfinal/jfinal-4.2-web-1.0/boot/*:/opt/jfinal/jfinal-4.2-web-1.0/lib/*:/opt/jfinal/jfinal-4.2-web-1.0/config:/opt/jfinal/jfinal-4.2-web-1.0/static com.litong.jfinal.Application
将下面的目录添加到classpath目录下
/opt/jfinal/jfinal-4.2-web-1.0/boot/* 保留目录 /opt/jfinal/jfinal-4.2-web-1.0/lib/* jar包目录 /opt/jfinal/jfinal-4.2-web-1.0/config 配置目录 /opt/jfinal/jfinal-4.2-web-1.0/static 静态文件目录
配置nginx代理
location /jfinal-4.2-web {
proxy_pass http://127.0.0.1:11023;
}
location ~ ^/jfinal-4.2-web/.*\.(html|css|js|jpg|jpeg|gif|png|PNG|ico|pdf|txt|woff2|wmv|mp4|avi)$ {
root /opt/jfinal/jfinal-4.2-web-1.0/static;
}重启nginx
nginx -s reload
至此完了第一阶段
设置开机启动
修改/opt/jfinal/jfinal-4.2-web-1.0/service/jfinal-4.2-web.service 将jfinal.sh的路径设置为正确的路径
[Unit] Description=ip After=network.target [Service] ExecStart=/opt/jfinal/jfinal-4.2-web-1.0/jfinal.sh start ExecStop=/opt/jfinal/jfinal-4.2-web-1.0/jfinal.sh stop ExecReload=/opt/jfinal/jfinal-4.2-web-1.0/jfinal.sh restart Type=forking PrivateTmp=true [Install] WantedBy=multi-user.target
关闭jfinal,防止端口冲突
/opt/jfinal/jfinal-4.2-web-1.0/jfinal.sh stop
启动程序设置开机启动,查看启动是否成功
cp /opt/jfinal/jfinal-4.2-web-1.0/service/jfinal-4.2-web.service /lib/systemd/system systemctl start jfinal-4.2-web systemctl enable jfinal-4.2-web systemctl status jfinal-4.2-web
开机启动设置完成
至此完了第二阶段
更新部署
如果修改了配置文件,将配置文件上传到/opt/jfinal/jfinal-4.2-web-1.0/config 重启项目
如果修改了java文件,执行 clean package -DskipTests命令,生成jar添加到 /opt/jfinal/jfinal-4.2-web-1.0/lib目录下 重启项目
如果新增了jar包也上传到/opt/jfinal/jfinal-4.2-web-1.0/config目录下 重启项目
修改修改了静态文件,将静态文件复制到/opt/jfinal/jfinal-4.2-web-1.0/static/jfinal-4.2-web 下不用重启项目
重启项目命令
systemctl restart jfinal-4.2-web
更新完成