jbase编译与部署的优化

2023-11-06 23:04
文章标签 编译 部署 优化 jbase

本文主要是介绍jbase编译与部署的优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇的演示只是涉及自动编译业务脚本。演示时候工程编译是超级慢的。因为把静态资源放在了Web工程下,每次编译都要拷贝,运行起码是1分钟,不能忍受,为此思考工程结构改解决这个问题,顺带方便开发的发布。运行WebLoader能达到5秒内把网站启动,同时打开辅助的页面打开器。

老的结构是这样子的,为了编译运行时候借助tomcat一起发布静态资源,就把静态资源放Web工程,导致的问题就是每次编译都要拷贝静态资源,超级慢,同时还要配idea的Tomcat设置
在这里插入图片描述
调整工程结构,把WebUI拆成WebBase和WebLoader两部分,WebBase只包含网站的servlet基础,剔除静态资源和业务脚本,WebLoader是一个控制台,负载加载Web,同时放静态资源和Java业务脚本
在这里插入图片描述

简化后的WebBase,平时不编译,涉及到调用和主体变动才编译得到WEB-INF拷贝到WebLoader
在这里插入图片描述
WebLoader是控制台程序复杂驱动Tomcat的停止和启动脚本,同时启动实现的页面打开器,他里面加上静态资源也Java业务脚本,既能让.java享受语法检查,又不用编译拷贝,同时发布时候只要拷贝WebSrc即可
在这里插入图片描述
加载器逻辑

package WebLoader;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
import java.nio.file.Paths;
import java.util.Scanner;//网站加载器,引导加载网站
public class Main {//加载入口public static void main(String[] args) {System.out.println("本控制台将负责引导启动网站");try{File directory = new File("");// 参数为空String courseFile = directory.getCanonicalPath();System.out.println(courseFile);String binPath= Paths.get(courseFile,"WebSrc","bin").toString();String stopBatPath= Paths.get(courseFile,"WebSrc","bin","shutdown.bat").toString();String startBatPath= Paths.get(courseFile,"WebSrc","bin","startup.bat").toString();//结束打开页面工具KillProcess("DevOpenPage.exe");System.out.println("尝试停止站点");System.out.println("执行脚本:"+stopBatPath);TryExecCmd(stopBatPath,binPath);//启动页面打开工具String openPageUtil= Paths.get(courseFile,"WebSrc","webapps","ankilis","DevOpenPage","DevOpenPage.exe").toString();StartExe(openPageUtil,binPath);System.out.println("尝试启动站点");System.out.println("执行脚本:"+startBatPath);TryExecCmd(startBatPath,binPath);}catch (Exception ex){System.out.println(ex.getMessage());}}//结束指定名称进程//processName:进程名public static void KillProcess(String processName) {try {String line;Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe");BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line = input.readLine()) != null) {if (line.contains(processName)) {String processId = line.split("\\s+")[1];Runtime.getRuntime().exec("taskkill /F /PID " + processId);System.out.println("Process " + processName + " has been killed.");}}input.close();} catch (IOException e) {e.printStackTrace();}}//启动Exe//cmdStr:命令串//runDir:运行路径private static void StartExe(String cmdStr,String runDir){File directory = new File(runDir);try{System.out.println("启动:"+cmdStr);// 创建进程并执行命令Process process = Runtime.getRuntime().exec(cmdStr,null,directory);}catch (Exception ex){System.out.println(ex.getMessage());}}//执行cmd//cmdStr:命令串//runDir:运行路径private static void TryExecCmd(String cmdStr,String runDir){File directory = new File(runDir);try{System.out.println("执行:"+cmdStr);// 创建进程并执行命令Process process = Runtime.getRuntime().exec(cmdStr,null,directory);// 获取命令行程序的输出结果BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 等待命令行程序执行完毕int exitCode=process.waitFor();// 关闭资源reader.close();System.out.println("返回:"+exitCode);}catch (Exception ex){System.out.println(ex.getMessage());}}
}

WebSrc内嵌的是一个Tomcat
在这里插入图片描述

静态资源和业务脚本在这里
在这里插入图片描述

同时为了内嵌Tomcat改造了他的startup.bat和shutdown.bat
startup.bat

@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements.  See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License.  You may obtain a copy of the License at
rem
rem     http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.rem ---------------------------------------------------------------------------
rem Start script for the CATALINA Server
rem ---------------------------------------------------------------------------setlocalcd ..
set "CATALINA_HOME=%cd%"rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHomeset "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExecrem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end

shutdown.bat

@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements.  See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License.  You may obtain a copy of the License at
rem
rem     http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.rem ---------------------------------------------------------------------------
rem Stop script for the CATALINA Server
rem ---------------------------------------------------------------------------setlocalcd ..
set "CATALINA_HOME=%cd%"rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHomeset "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExecrem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgscall "%EXECUTABLE%" stop %CMD_LINE_ARGS%:end

用C#实现页面打开器方便开发打开页面

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace DevOpenPage
{public partial class FrmMian : Form{/// <summary>/// 写日志/// </summary>/// <param name="str"></param>private delegate void WriteLog(string str);/// <summary>/// java文件集合/// </summary>private List<Dto> list = new List<Dto>();/// <summary>/// 静态文件路径/// </summary>string StaticFilesPath = "";public FrmMian(){InitializeComponent();}/// <summary>/// 加载函数/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){DirectoryInfo di = new DirectoryInfo(Application.StartupPath);StaticFilesPath = di.Parent.FullName;LoadTree();WriteLogToUI("本程序路径:" + Path.Combine(AppContext.BaseDirectory, "DevOpenPage.exe"));Task.Run(() =>{System.Threading.Thread.Sleep(7000);ChomeViewUtil.OpenChrome("http://localhost:8080/ankilis/login/form/Login.aspx");});}/// <summary>/// 加载数/// </summary>private void LoadTree(){treeViewMian.Nodes.Clear();list.Clear();TreeNode root = new TreeNode();root.Text = @"ankilis";root.Tag = StaticFilesPath;treeViewMian.Nodes.Add(root);BindChild(root);root.Expand();}/// <summary>/// 回调/// </summary>/// <param name="sender"></param>/// <param name="certificate"></param>/// <param name="chain"></param>/// <param name="errors"></param>/// <returns></returns>private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors){//总是接受  return true;}/// <summary>/// 绑定子节点/// </summary>/// <param name="fNode"></param>private bool BindChild(TreeNode fNode){string path = fNode.Tag.ToString();//父目录DirectoryInfo fDir = new DirectoryInfo(path);FileSystemInfo[] finfos = fDir.GetFileSystemInfos();bool HasFile = false;foreach (FileSystemInfo f in finfos){if (fDir.GetType() != f.GetType()){if(txtFilter.Text!=""&&(!f.Name.ToLower().Contains(txtFilter.Text.ToLower()))){continue;}}TreeNode node = new TreeNode();node.Text = f.Name;node.Tag = f.FullName;if(f.Extension==".java"){Dto dto = new Dto();dto.FullName = f.FullName.Replace(".java",".ashx");dto.LastTime = f.LastWriteTime;list.Add(dto);}if (f.Extension == ".aspx"|| f.Extension == ".html" || f.Extension == ".java"){node.ForeColor = Color.Blue;}//是文件夹时才递归调用自己if (fDir.GetType() == f.GetType()) {bool ChildHasFile=BindChild(node);if(ChildHasFile==true){HasFile = true;fNode.Nodes.Add(node);}}else{HasFile = true;fNode.Nodes.Add(node);}}return HasFile;}/// <summary>/// 双击打开/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void treeViewMian_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e){string fullPath = e.Node.Tag.ToString();if (fullPath.Contains(".aspx")|| e.Node.Tag.ToString().Contains(".html") || e.Node.Tag.ToString().Contains(".java")){ChomeViewUtil.OpenChrome("http://localhost:8080/"+e.Node.FullPath.Replace(".java", ".ashx"));WriteLogToUI("打开" + "http://localhost:8080/" + e.Node.FullPath.Replace(".java", ".ashx"));}else{if(File.Exists(fullPath)){Process process = new Process();process.StartInfo.FileName = "cmd.exe";process.StartInfo.UseShellExecute = false;process.StartInfo.RedirectStandardInput = false;process.StartInfo.RedirectStandardOutput = false;process.StartInfo.RedirectStandardError = false;process.StartInfo.CreateNoWindow = true;process.StartInfo.Arguments = @"/c " + fullPath;process.Start();WriteLogToUI("打开" + fullPath);}}}/// <summary>/// 刷新树/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRefresh_Click(object sender, EventArgs e){list.Clear();LoadTree();WriteLogToUI("刷新目录成功");}/// <summary>/// 写日志到界面/// </summary>/// <param name="str"></param>private void WriteLogToUI(string str){WriteLog txthandler = new WriteLog(SetLogTxt);txtLog.Invoke(txthandler, new object[] { str });}/// <summary>/// 设置日志控件文本/// </summary>/// <param name="str"></param>private void SetLogTxt(string str){txtLog.Text += DateTime.Now.ToString("hh:mm:ss# ")+str + "\n";}/// <summary>/// 实体/// </summary>public class Dto{/// <summary>/// 全名/// </summary>public string FullName{get;set;}/// <summary>/// 最后修改时间/// </summary>public DateTime LastTime{get;set;}}/// <summary>/// 模糊查询/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void txtFilter_KeyDown(object sender, KeyEventArgs e){if(e.KeyCode==Keys.Enter){LoadTree();}}}
}

谷歌打开工具

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;namespace DevOpenPage
{/// <summary>/// 用谷歌打开url工具/// </summary>public static class ChomeViewUtil{/// <summary>/// 谷歌打开url/// </summary>/// <param name="path">url</param>/// <param name="isApp">是否app模式</param>public static void OpenChrome(string path, bool isApp = false){string chromePath = "";bool IsChrome = TryGetSoftwarePath("chrome", out chromePath);if (IsChrome && chromePath.Length > 0){Console.WriteLine("驱动Chrome打开登录链接");if (isApp == true){System.Diagnostics.Process.Start(chromePath, "--app=" + path);}else{System.Diagnostics.Process.Start(chromePath, path);}}else{Console.WriteLine("没安装Chrome,驱动默认浏览器打开登录链接");//调用系统默认的浏览器 System.Diagnostics.Process.Start(path);}}/// <summary>/// 获取某个安装文件的执行路径/// </summary>/// <param name="softName">软件名</param>/// <param name="path">路径</param>/// <returns></returns>public static bool TryGetSoftwarePath(string softName, out string path){string strPathResult = string.Empty;string strKeyName = "";    object objResult = null;Microsoft.Win32.RegistryValueKind regValueKind;Microsoft.Win32.RegistryKey regKey = null;Microsoft.Win32.RegistryKey regSubKey = null;try{//Read the key regKey = Microsoft.Win32.Registry.LocalMachine;regSubKey = regKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + softName.ToString() + ".exe", false);//如果在LocalMachine获取不到,可以在CurrentUser里获取if (regSubKey == null){regKey = Microsoft.Win32.Registry.CurrentUser;regSubKey = regKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + softName.ToString() + ".exe", false);}if(regSubKey==null){path = "";return false;}//Read the path objResult = regSubKey.GetValue(strKeyName);regValueKind = regSubKey.GetValueKind(strKeyName);//Set the path if (regValueKind == Microsoft.Win32.RegistryValueKind.String){strPathResult = objResult.ToString();}}catch (System.Security.SecurityException ex){path = "";System.Windows.Forms.MessageBox.Show("你没有读取注册表的权限! "+ex.Message);}catch (Exception ex){path = "";System.Windows.Forms.MessageBox.Show("读取注册表错误! " + ex.Message);}finally{if (regKey != null){regKey.Close();regKey = null;}if (regSubKey != null){regSubKey.Close();regSubKey = null;}}if (strPathResult != string.Empty){path = strPathResult;return true;}else{path = "";return false;}}}
}

Linux部署
先安装jdk

[root@localhost ~]# yum install  java-1.8.0-openjdk* -y

然后打开8080端口和查看jdk版本

[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
[root@localhost ~]# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)

然后尝试启动测试网站,这里要给startup.sh、catalina.sh、shutdown.sh执行权限,给WebSrc目录权限,否则javac无法编译,别的没什么主意的。

在这里插入图片描述

[root@localhost ~]# bash /WebSrc/bin/startup.sh
Cannot find /WebSrc/bin/catalina.sh
The file is absent or does not have execute permission
This file is needed to run this program
[root@localhost ~]# chmod +x /WebSrc/bin/startup.sh
[root@localhost ~]# bash /WebSrc/bin/startup.sh
Cannot find /WebSrc/bin/catalina.sh
The file is absent or does not have execute permission
This file is needed to run this program
[root@localhost ~]# chmod +x /WebSrc/bin/catalina.sh
[root@localhost ~]# bash /WebSrc/bin/startup.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
[root@localhost ~]# bash /WebSrc/bin/shutdown.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
[root@localhost ~]# bash /WebSrc/bin/shutdown.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Nov 06, 2023 9:02:45 PM org.apache.catalina.startup.Catalina stopServer
SEVERE: Could not contact [localhost:8005] (base port [8005] and offset [0]). Tomcat may not be running.
Nov 06, 2023 9:02:45 PM org.apache.catalina.startup.Catalina stopServer
SEVERE: Error stopping Catalina
java.net.ConnectException: Connection refused (Connection refused)at java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:607)at java.net.Socket.connect(Socket.java:556)at java.net.Socket.<init>(Socket.java:452)at java.net.Socket.<init>(Socket.java:229)at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:667)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:393)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:483)[root@localhost ~]# bash /WebSrc/bin/startup.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# bash /WebSrc/bin/shutdown.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
[root@localhost ~]# bash /WebSrc/bin/startup.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
[root@localhost ~]# bash /WebSrc/bin/shutdown.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
[root@localhost ~]# bash /WebSrc/bin/startup.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
[root@localhost ~]# chmod -R +777 /WebSrc
[root@localhost ~]# bash /WebSrc/bin/shutdown.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
[root@localhost ~]# bash /WebSrc/bin/startup.sh
Using CATALINA_BASE:   /WebSrc
Using CATALINA_HOME:   /WebSrc
Using CATALINA_TMPDIR: /WebSrc/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /WebSrc/bin/bootstrap.jar:/WebSrc/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.

部署只要上传WebSrc文件夹到Linux或者直接运行Windows下的WebSrc/bin的启动脚本(前提是安装jdk)。Linux上设置文件夹权限和启动停止脚本权限,非常简单。

CentOS7上发布效果
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

改业务代码测试
在这里插入图片描述

在这里插入图片描述

轻松加愉快,开发和Linux发布都很简单,不依赖Maven、不用配开发idea的tomcat,不用niginx代理前后台。前后台做到分而不离。下一阶段实现代码生成器和通用码表,通用码表可以解决百分之80左右的基础维护界面。生效的百分之二十的维护界面借助代码生成器生成的代码解决这里面的百分之80工作量,从而极大降低基础维护的开发量,等于剩下约百分之四。

通用码表原理

代码生成器原理

这篇关于jbase编译与部署的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359582

相关文章

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决