最近正在开发一个 Java & Vue.js 全栈项目,该项目由以下几部分组成:Java 后端服务器、基于 Vue.js 的单页应用、基于 JavaFX 的 GUI 客户端以及其他辅助工具等。

其中 Java 服务端及客户端均依赖公共的 Jar 包,基于 Vue.js 构建生成的静态文件亦须转移至后端模块的相关目录中,由后端模块附带的 Web 服务器管理。如果对项目中的某个子模块进行修改,需要对其手动编译、移动,再对父模块进行编译,操作繁琐,本文探讨通过 Windows 10 的 Linux 子系统运行 Shell 脚本简化上述操作并进行扩展。

之前的一篇文章已探讨过 Linux 子系统的使用及在该系统下,Java、Node.js、Gradle 等工具的配置,本文不再赘述。本文开篇首先优化 Linux 子系统「Windows Subsystem for Linux (WSL) 」的使用体验,

1. 使用 wsl-terminal 增强 WSL 的使用体验

wsl-terminal 是专门为 WSL 准备的终端模拟器,主体是 mintty,另外整合了一些相当友好的特性,使用起来非常方便,也是目前用户体验最好的,推荐使用。

感觉自从用上了 wsl-terminal,完全同时获得了 Windows 10 优异的界面效果和娱乐性,以及 Linux 的专业性和效率,并且两者能够完美融合在一起,完全可以取得好于 macOS 的使用体验「此处为 YY,我未深度使用过 macOS,坐等打脸」。

wsl-terminal 主要具有如下特性:

优秀的兼容性(中文显示/输入、 24 位颜色、命令输出等都正常了)。

体积小巧,压缩包仅 1.7 M 多,解压后不到 10 M 。

配置简单, mintty 可以直接在标题栏右键配置, wsl-terminal 的配置文件也很简单。

可以直接在资源管理器右键打开终端模拟器并定位到当前目录。

可以将 .sh/.py/.pl 脚本关联到用 wsl-terminal 运行。

可以将文本文件关联到用 wsl-terminal 里的 vim 运行。

支持 tmux ,可以在 tmux 里打开新目录,恢复已有的 tmux 会话等。

支持在 WSL 里直接运行 Windows 程序。

注: 本小节摘抄了这篇博客的部分内容。

2. 全栈项目的整体架构

项目的整体架构如下图所示:

3. 特定脚本指令及其含义

3.1 获取当前 Shell 脚本所在的绝对路径

dirname file # 获取 file 文件的相对路径

echo $0 # 获取当前执行的脚本文件名

pwd # 显示当前工作目录

由以上命令可总结出,获取当前 Shell 脚本所在的绝对路径的命令如下:

SH_PATH=$(cd `dirname $0`; pwd)

3.2 Web 静态文件

Gradle / Spring 工程中,./src/main/resources/static 目录下可存放静态文件,在服务端程序运行时,即可获取此目录下的静态文件,所以需要将通过 Webpack 编译、构建生成的静态文件存放在该目录下。

cp -r ./dist/* $SERVER_PATH/src/main/resources/static # 将静态文件复制到指定位置

3.3 获取 Gradle 构建生成的目标 Jar 文件的文件名

运行 gradle build 后,即可在 $PROJECT/build/libs 中生成目标 Jar 文件,获取该文件的文件名,以备之后生成 Jar 运行脚本所用:

NAME=`ls $PROJECT/build/libs` # 获取当前目录下唯一的文件的文件名

3.4 获取该脚本执行时的时间

各工程模块均编译、构建完毕后,需要统一存放在同一个目录中,各个时期生成的目录以时间命名进行区分。

BUILD_TIME=`date "+%Y-%m-%d_%H-%M"` # 获取脚本执行时的时间

4. 该项目的一键构建、打包 Shell 脚本

4.1 脚本具体执行流程

清理各个工程的历史构建缓存

编译 Web 工程生成静态文件,移入后端工程相应目录。

编译公共依赖 Jar 包,移入后端工程、客户端工程相应目录。

编译后端工程、客户端工程。

后端工程、客户端工程编译后生成的 Jar 文件移入打包目录中,该目录以脚本运行时的时间作为区分。

该脚本的具体执行流程如下图所示,具体步骤如下:

4.2 一键构建、打包脚本

本文已经将脚本的重点、流程等内容进行了详细的介绍,现在贴出脚本具体内容,如下所示:

#!/bin/bash

# 集群设备管理系统工程的 web 端、模拟客户端、服务器端等的整体清理、构建、打包、发布

PROJECT_PATH=/mnt/d/project/ClusterDevicePlatform; # 主工程所在目录

WEB_PATH=/mnt/d/project/cluster-device-platform-web; # Web 模块所在目录

SH_PATH=$(cd `dirname $0`; pwd) # 脚本所在目录

BUILD_TIME=`date "+%Y-%m-%d_%H-%M"` # 脚本运行时间

UTIL_JAR_PATH=$PROJECT_PATH/messageUtils; # 公共 Jar 模块所在目录

SERVER_PATH=$PROJECT_PATH/ClusterDevicePlatform-server; # 服务器模块所在目录

CLIENT_PATH=$PROJECT_PATH/ClusterDevicePlatform-client; # 硬件模拟客户端模块所在目录

# 项目已编译历史文件的清理

cd $UTIL_JAR_PATH;

rm -rf ./build;

cd $CLIENT_PATH;

rm -rf ./build;

cd $SERVER_PATH;

rm -rf ./build;

rm -rf ./src/main/resources/static;

cd $WEB_PATH;

rm -rf ./dist;

# Web 编译并将静态页面文件移入服务器项目中

npm run build

if [ ! $? -eq 0 ]

then echo "Web 编译出错"

exit 1

fi

echo Web 编译完毕

mkdir $SERVER_PATH/src/main/resources/static

cp -r ./dist/* $SERVER_PATH/src/main/resources/static

# Client、Server 的编译

cd $UTIL_JAR_PATH;

gradle build

cd $CLIENT_PATH;

gradle build

cd $SERVER_PATH;

gradle build

# 组织并集中编译生成的待发布文件

mkdir -p $PROJECT_PATH/publish/release/serverRelease_$BUILD_TIME

cd $PROJECT_PATH/publish/release/serverRelease_$BUILD_TIME

cp $CLIENT_PATH/build/libs/* .

cp $SERVER_PATH/build/libs/* .

cp $SH_PATH/template/* .

# 组装 Client、Server 的运行脚本

CLIENT_NAME=`ls $CLIENT_PATH/build/libs`

SERVER_NAME=`ls $SERVER_PATH/build/libs`

echo chcp 65001 >> run-client.ps1

echo java -jar -\'Dfile.encoding\'=UTF-8 .\\$CLIENT_NAME cdg-pc 100 >> run-client.ps1

echo '$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")' >> run-client.ps1

echo chcp 65001 >> run-server.ps1

echo java -jar -\'Dfile.encoding\'=UTF-8 .\\$SERVER_NAME >> run-server.ps1

echo '$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")' >> run-server.ps1

参考链接

JAVA包可以构建一个子系统_Windows 10 用于 Linux 子系统的一键构建、打包脚本「 Node、Gradle 项目」...相关推荐

  1. Windows 10安装Linux子系统、可视化Linux、子系统中openfoam

    Windows 10安装Linux子系统.可视化Linux.子系统中openfoam安装 一. Windows 10安装Linux子系统 打开Windows PowerShell(管理员) 鼠标右键点 ...

  2. wsl2设置挂载_Windows下的Linux子系统安装,WSL 2下配置docker

    Windows下的Linux子系统安装,WSL 2下配置docker 前提条件: 安装WSL 2需要Windows 10版本是Build 18917或更高,首先先确认系统版本已升级. 在"启 ...

  3. 生物信息学linux安装,构建生物信息学环境-1(Win10 Linux子系统的安装)

    生信的入门,如果实验室之前没有人从事生物信息学的师兄师姐的话,其实入门还是挺麻烦的,如果再不懂电脑,缺少各种东西,就会特别麻烦.想要做生信分析自然少不掉的就是自己搭建一个生信分析环境.因为我自己的个人 ...

  4. 【Flutter】从安卓与iOS包体优化到一键自动打包脚本的一条龙服务

    系统信息 System version: MacOS 12 Flutter version: 1.22.5 Dart version: 2.10.4 Android Studio version: 4 ...

  5. centos7子系统 win10_Windows10内置Linux子系统初体验

    WSL 前言 前段时间,机子上的 win10 又偷偷摸摸升级到了一周年正式版,比较无奈.不过之前听闻这个版本已经支持内置的 Linux 子系统,于是就怀着好奇心试玩了一把.虽然期间遇到了很多问题,但总 ...

  6. win10搭建Linux子系统,win10中搭建Linux子系统

    win10自带的Linux子系统,简称WSL(Windows Subsystem for Linux).优势是打通了Linux系统和windows系统,改变了传统虚拟机/双系统形成的两个系统相互隔绝的 ...

  7. 在 Windows 10 的 Linux 子系统(WSL)中运行 Kali

    Windows Subsystem for Linux (WSL) 出来也有一段时间了.也有不少朋友通过 Katoolin 来给 Bash on Ubuntu on Windows,添加 Kali 工 ...

  8. linux卡利系统设置密码,Windows 10 Windows Linux子系统安装指南-官网

    安装Linux的Windows子系统 在Windows上安装任何Linux发行版之前,必须启用" Linux的Windows子系统"可选功能. 以管理员身份打开PowerShell ...

  9. Windows 10 安装 Linux 子系统(Windows Subsystem for Linux)

    Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层. 这几天在搞 redis,但是官方居然 ...

最新文章

  1. Go 运行时(go runtime)的含义
  2. ubuntu修改主机名后无法解析主机
  3. Java架构师笔记-你必须掌握学习Java需要掌握哪些技能
  4. SAP SD基础知识之免费订单
  5. 教你认识动态链接库DLL文件
  6. CentOS 8 即将停更,未来我们该何去何从?
  7. tf.broadcast_dynamic_shape
  8. Spring MVC中的视图解析ViewResolver
  9. BZOJ1725 牧场的安排
  10. 关于交换机和路由器的区别介绍
  11. 从0-1背包问题学习回溯法、分支界限法、动态规划
  12. 9102,用原生js造一个轮播组件
  13. 实施工程师面试基本问题
  14. SQL获取当前时间、年、月、日等
  15. Head First Java
  16. c语言中阶乘相加怎么表示_c语言求阶乘累加和
  17. ASPP - 空洞空间金字塔池化
  18. Silverlight轻量级查询对比
  19. java 打砖块算法_打砖块java代码详细
  20. Excel中制作目录的3种方法,你了解几种?

热门文章

  1. 协同多种SAR数据及多光谱数据的星载激光雷达GEDI森林生物量估测
  2. easyexcel读取excel合并单元格数据
  3. 极大连通图、极大强连通图、连通分量、强连通分量(一目了然!)
  4. resolution will not be reattempted until the update interval of vas has elap
  5. jsplumb拖线_jsPlumb插件做一个模仿viso的可拖拉流程图
  6. CTFshow SSRF
  7. postgresql|数据库|基于本地备份的远程备份策略
  8. 电子二极管(真空二极管), 电子三极管(真空三极管), 晶体二极管, 晶体三极管
  9. TomcatServlet快速入门
  10. Linux服务配置 samba服务器配置