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}" ;; esac
jfinal-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
更新完成