jfinal-4.2 前后台端分离打包方式 nginx代理配置 设置为开启启动

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目录下

工程目录结构

image.png

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

image.png

打包完后生成的文件是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

更新完成

评论区

热门分享

扫码入社