JRT实体比对

之前已经实现了JRT实体编译的菜单,用Linux指令编译放在网站下的实体代码。那么就有个问题,有人就是直接换实体jar文件不修改网站的实体代码。或者就只修改实体代码不编译搁置在那里,那么后面更新实体的人就得给别人背锅,后面人新编译实体导致使用的实体丢代码或者把别人放着一半的代码编译进去了,为了避免这种背锅的情况产生,提供实体比对功能。编译实体之前先比对当前网站的实体代码和实体jar包是否一致。

在这里插入图片描述

实现比对,实体编译的时候把源码也放进了jar包

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 * 编译JRT架构下的实体jar包,编译的实体工程文件和代码放在Web的CompileModel下面,驱动java -cp D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel BuildModel JRT.Model来编译,
 * JRT.Model为实体的文件名称,将借助此工具实现JRT的业务脚本化目标部分的实体代码脚本化部分,在Web下的CompileModel放实体代码,需要改实体时候修改代码后运行jrt命令选8编译实体即可,
 * 实体的业务脚本化不采用自动编译的模式,和普通业务脚本的差别就是让人命令执行
 */
public class BuildModel {
    /**
     * 实体名称
     */
    private static String ModeDirName = "JRT.Model";

    /**
     * 实体编译入口
     *
     * @param args
     */
    public static void main(String[] args) {
        try {
            //检查参数
            if (args == null || args.length == 0) {
                System.out.println("请传入实体文件夹名字");
                return;
            } else {
                ModeDirName = args[0];
            }
            //创建编译对象
            BuildModel bl = new BuildModel();
            if (args.length > 1) {
                //比对实体
                if (args[1].equals("compare")) {
                    List<String> javaList = bl.CompareAllJavas();
                    return;
                }
            }
            System.out.println("开始编译实体...");

            //开始编译
            bl.BuildJava();
        } catch (Exception ex) {
            ex.printStackTrace(System.out);
        }
    }

    /**
     * 得到再用的实体里面所有的java类路径
     *
     * @return
     * @throws Exception
     */
    public List<String> CompareAllJavas() throws Exception {
        List<String> javas = new ArrayList<>();
        //得到.class所在的路径CompileModel
        String srcpath = this.getClass().getResource("").getPath();
        String curPath = new File(srcpath).toString();
        //上一级是Web的路径
        String webPath = new File(curPath).getParent();
        File fiBase = new File(webPath);
        String parentPath = fiBase.getParent();
        //到webapps一级
        File fiParent = new File(parentPath);
        //到WebSrc一级
        File fiParent1 = new File(fiParent.getParent());
        //jar包存放路径
        String bashePath = Paths.get(fiParent1.toString(), "lib").toString() + File.separator;
        System.out.println("jar包路径:" + bashePath);
        //组装成jar包路径
        String jarPath = bashePath + ModeDirName + ".jar";
        File file = new File(jarPath);
        if (!file.exists()) {
            throw new Exception("未能找到" + jarPath + "的文件");
        }
        //实体根路径
        String modeldir = Paths.get(curPath, ModeDirName).toString();
        //遍历文件
        List<String> newCodes = SeeFile(new File(modeldir), ".java");
        //不一致数量
        int notEquealNum = 0;
        try (JarFile jarFile = new JarFile(jarPath)) {
            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry entry = entries.nextElement();
                if (entry.getName().endsWith(".java")) {
                    InputStream inputStream = jarFile.getInputStream(entry);
                    Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
                    BufferedReader bufferedReader = new BufferedReader(reader);
                    StringBuilder contentBuilder = new StringBuilder();
                    String line;
                    while ((line = bufferedReader.readLine()) != null) {
                        contentBuilder.append(line + System.lineSeparator());
                    }
                    String oldCode = contentBuilder.toString();
                    //新实体路径
                    String newCodePath = GetNewCodePath(entry.getName(), curPath);
                    String newCode = "";
                    File fi = new File(newCodePath);
                    //新实体代码
                    if (fi.exists()) {
                        newCode = ReadTextStr(newCodePath);
                    }
                    //移除都有的文件名称,最后剩余的就是新代码多加的类
                    if (newCodes.contains(newCodePath)) {
                        newCodes.remove(newCodePath);
                    }
                    if (!oldCode.equals(newCode)) {
                        System.out.println("-------------------------------------------------------------------------------------------------------");
                        System.out.println(entry.getName() + "代码不一致");
                        System.out.println("老代码:");
                        System.out.println(oldCode);
                        System.out.println("新代码:");
                        System.out.println(newCode);
                        System.out.println("-------------------------------------------------------------------------------------------------------");
                        System.out.println("");
                        notEquealNum++;
                    }
                    bufferedReader.close();
                    reader.close();
                }
            }
        }
        //新代码比老代码多的部分
        if (newCodes.size() > 0) {
            System.out.println("******************************************************************************************");
            System.out.println("以下实体是老代码没有的,新代码有的实体");
            for (String s : newCodes) {
                System.out.println("-------------------------------------------------------------------------------------------------------");
                System.out.println("新代码:");
                String newCode = ReadTextStr(s);
                System.out.println(newCode);
                System.out.println("-------------------------------------------------------------------------------------------------------");
                System.out.println("");
                notEquealNum++;
            }
        }
        if (notEquealNum == 0) {
            System.out.println("当前使用的实体和代码没差异");
        } else {
            System.out.println("当前使用的实体和代码有" + notEquealNum + "个差异,请比对后再编译");
        }

        return javas;
    }

    /**
     * 得到新的实体代码路径
     *
     * @param path      jar包类的相对路径
     * @param modelPath 实体根路径
     * @return
     * @throws Exception
     */
    private String GetNewCodePath(String path, String modelPath) throws Exception {
        String[] arr = path.split("/");
        String codePath = Paths.get(modelPath, ModeDirName).toString();
        if (arr.length > 2) {
            for (int i = 2; i < arr.length; i++) {
                codePath = Paths.get(codePath, arr[i]).toString();
            }

        }
        return codePath;
    }

    /**
     * 读取文本
     *
     * @param path 路径
     * @return
     */
    public String ReadTextStr(String path) throws Exception {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(path)), "UTF-8"));
            String str = null;
            while ((str = br.readLine()) != null) {
                sb.append(str + System.lineSeparator());
            }
        } catch (IOException e) {
            throw e;
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

    /**
     * 编译java代码
     *
     * @throws Exception
     */
    public void BuildJava() throws Exception {
        //得到.class所在的路径CompileModel
        String srcpath = this.getClass().getResource("").getPath();
        String curPath = new File(srcpath).toString();
        //上一级是Web的路径
        String webPath = new File(curPath).getParent();
        //编译成功了就生成这样的文件表示成功
        String successFilePath = Paths.get(curPath, "buildsuccess.jrt").toString();
        File successFile = new File(successFilePath);
        //删删除成功标志
        if (successFile.exists()) {
            successFile.delete();
        }
        //编译执行
        int retcode = BuildJavaDo(webPath, curPath);
        //编译成功
        if (retcode == 0) {
            successFile.createNewFile();
        }
        System.out.println("编译结束返回:" + retcode);
    }


    /**
     * 编译java执行
     *
     * @param webPath 网站路径
     * @param curPath 编译程序class所在路径
     * @return 返回0编译成功
     * @throws Exception
     */
    private int BuildJavaDo(String webPath, String curPath) throws Exception {
        File fiBase = new File(webPath);
        String parentPath = fiBase.getParent();
        //到webapps一级
        File fiParent = new File(parentPath);
        //到WebSrc一级
        File fiParent1 = new File(fiParent.getParent());
        //jar包存放路径
        String libPath = Paths.get(fiParent1.toString(), "lib").toString() + File.separator;
        System.out.println("jar包路径:" + libPath);
        String cmd = "javac -encoding UTF-8 -classpath ";
        //实体代码文件夹
        String modelPath = Paths.get(curPath, ModeDirName).toString();
        //实体代码工程文件
        String imlFile = Paths.get(modelPath, ModeDirName + ".iml").toString();
        //判断配置是否存在
        File iml = new File(imlFile);
        if (!iml.exists()) {
            System.out.println(imlFile + "文件不存在,请确认!");
            return -1;
        }
        //解析xml
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(iml);
        //获得根节点
        Element rootElement = document.getDocumentElement();
        //获得根节点下的所有子节点
        NodeList students = rootElement.getElementsByTagName("component");
        String classPath = "";
        String sp = ";";
        if (IsOSLinux()) {
            sp = ":";
        }
        //解析配置,得到依赖jar包
        for (int i = 0; i < students.getLength(); i++) {
            //由于节点多种类型,而一般我们需要处理的是元素节点
            Node childNode = students.item(i);
            //元素节点就是非空的子节点,也就是还有孩子的子节点
            if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                Element childElement = (Element) childNode;
                NodeList children = childElement.getChildNodes();
                for (int k = 0; k < children.getLength(); k++) {
                    Node child = children.item(k);
                    if (child.getNodeType() == Node.ELEMENT_NODE) {
                        childElement = (Element) child;
                        //不是对象配置元素就忽略
                        if (childElement.getNodeName() != "orderEntry") {
                            continue;
                        }
                        //解析得到包名
                        String name = childElement.getAttribute("name");
                        String type = childElement.getAttribute("type");
                        if (!type.equals("library")) {
                            continue;
                        }
                        String oneJarPath = Paths.get(libPath, name + ".jar").toString();
                        if (classPath == "") {
                            classPath = oneJarPath;
                        } else {
                            classPath += sp + oneJarPath;
                        }
                    }
                }
            }
        }
        //遍历目录下所有java文件,组装成路径串,英文,分割路径
        File modeldir = new File(modelPath);
        System.out.println("查找:" + modeldir + "下的.java文件");
        //遍历文件
        List<String> files = SeeFile(modeldir, ".java");
        int execode = -1;
        Runtime exe = Runtime.getRuntime();
        //循环遍历路径编译文件
        if (files.size() > 0) {
            System.out.println("找到:" + files.size() + "个.java文件");
            String pathstr = "";
            int count = 0;
            for (int i = 0; i < files.size(); i++) {
                String path = files.get(i);
                //空路径退出
                if (path.isEmpty()) {
                    continue;
                }
                if (pathstr.isEmpty()) {
                    pathstr = path;
                } else {
                    pathstr = pathstr + " " + path;
                }
                count++;
                //一次编译100个文件,太多文件导致串太长,编译报错
                if (((count) % 100 == 0) || ((i + 1) == files.size())) {
                    System.out.println("执行编译:" + i + 1);
                    String execcmd = cmd + classPath + " " + pathstr;
                    //执行编译命令
                    execode = Exec(exe, execcmd, webPath);
                    pathstr = "";
                    if (execode != 0) {
                        break;
                    }
                }
            }
            System.out.println("编译结束!");
        } else {
            execode = 0;
            System.out.println("找到:" + files.size() + "个.java文件");
            System.out.println("没有需要编译的.java文件");
        }
        //编译成功,打包编译的class文件为jar包
        if (execode == 0) {
            System.out.println("编译成功!");
            String modelpath = Paths.get(curPath, ModeDirName).toString();
            String jarFileStr = ModeDirName + ".jar";
            //临时目录
            Path tmppath = Paths.get(curPath, "ModelTmp");
            if (!tmppath.toFile().exists()) {
                Files.createDirectory(tmppath);
            }
            String[] modelArr = ModeDirName.split("\\.");
            Path tmpmodel = Paths.get(tmppath.toString(), modelArr[0], modelArr[1]);
            //没有的路径就创建
            if (!tmpmodel.toFile().exists()) {
                Files.createDirectories(tmpmodel);
            }
            //拷贝class文件到临时目录
            Files.walk(Paths.get(modelpath)).filter(Files::isRegularFile).forEach((Path var) -> {
                try {
                    File file = var.toFile();
                    String fileabpath = file.getAbsolutePath().replace(modelpath, tmpmodel.toString());
                    //不是.class和.java的退出
                    if (!fileabpath.endsWith(".class") && !fileabpath.endsWith(".java")) {
                        return;
                    }
                    Path par = Paths.get(fileabpath).getParent();
                    //没路径的创建
                    if (!par.toFile().exists()) {
                        Files.createDirectories(par);
                    }
                    //把class文件复制到新的目录,方便打包
                    Files.copy(var, Paths.get(fileabpath), StandardCopyOption.REPLACE_EXISTING);
                } catch (Exception ex) {
                    ex.printStackTrace(System.out);
                }
            });
            System.out.println("打包:" + tmppath + "到:" + jarFileStr);
            cmd = "jar cf " + jarFileStr + " -C " + tmppath + " .";
            execode = Exec(exe, cmd, curPath);
            if (execode == 0) {
                System.out.println("打包完成!");
                //打包完成清除class文件,减少网站目录的文件数
                Files.walk(tmppath).filter(Files::isRegularFile).map(Path::toFile).forEach(File::deleteOnExit);
            }
        }
        return execode;
    }

    /**
     * 执行cmd命令
     *
     * @param exe
     * @param cmd
     * @param workdir
     * @return
     * @throws Exception
     */
    private int Exec(Runtime exe, String cmd, String workdir) throws Exception {
        if (workdir == null || workdir.isEmpty()) {
            workdir = ".";
        }
        System.out.println("执行:" + cmd);
        Process ps = exe.exec(cmd, null, Paths.get(workdir).toFile());
        // 获取命令行程序的输出结果
        StringBuilder retsb = new StringBuilder();
        //windows默认gb18030编码读取错误信息
        String charset = "gb18030";
        if (IsOSLinux()) {
            //linux用fut-8编码
            charset = "utf-8";
        }
        BufferedReader reader = new BufferedReader(new InputStreamReader(ps.getErrorStream(), charset));
        String line;
        while ((line = reader.readLine()) != null) {
            retsb.append(line);
        }
        int execode = ps.waitFor();
        ps.destroy();
        if (execode == 0) {
            System.out.println("执行成功!");
        } else {
            System.out.println("执行失败!");
            System.out.println(retsb);
        }
        return execode;
    }

    /**
     * 判断OS
     *
     * @return 得到是否是Linux
     */
    public static boolean IsOSLinux() {
        Properties prop = System.getProperties();
        String os = prop.getProperty("os.name");
        if (os != null && os.toLowerCase().indexOf("linux") > -1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 扫描文件
     *
     * @param dir
     * @param fileext
     * @return
     * @throws Exception
     */
    public static List<String> SeeFile(File dir, String fileext) throws Exception {
        ArrayList<String> list = new ArrayList<>();
        if (!dir.exists()) return list;
        if (dir.isFile()) {
            list.add(dir.getPath());
            return list;
        }
        Files.walk(dir.toPath()).filter(Files::isRegularFile).map(Path::toFile).forEach((File f) -> {
            String file = f.getPath();
            if (fileext != null && !fileext.isEmpty() && !file.toLowerCase().endsWith(fileext.toLowerCase())) {
                return;
            }
            if (fileext.equals(".java")) {
                String clspath = file.replace(".java", ".class");
                File clsfile = new File(clspath);
                if (clsfile.exists()) {
                    //java文件与之相应的class文件修改时间对比,class文件修改时间新就不编译
                    long clsmodtime = clsfile.lastModified();
                    long javamodtime = new File(file).lastModified();
                    if (clsmodtime > javamodtime) {
                        return;
                    }
                }
            }
            list.add(f.getPath());
        });
        return list;
    }
}

测试

D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel>
D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel>
D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel>
D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel>
D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel>java -cp D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel BuildModel JRT.Model compare
jar包路径:D:\JRTPlan\WebLoader\WebSrc\lib\
-------------------------------------------------------------------------------------------------------
JRT/Model/Entity/JRTPrintTemplate.java代码不一致
老代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
/**
 *[功能描述:本代码由LIS内部代码生成工具生成,请不要手动修改,如要修改,请写修改变更记录]
 *[创建者:JRT.Entity生成器]
 */
@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_PrintTemplate")
public class JRTPrintTemplate
{
        /**
         * 主键
         */
        @NotNullAttribute
        @IdAttribute(Name = "RowID")
        @LengthAttribute(MaxLen = 10)
        public int RowID;

        /**
         * 模板代码
         */
        @NotNullAttribute
        @LengthAttribute(MaxLen = 100)
        public String Code;

        /**
         * 模板名称
         */
        @NotNullAttribute
        @LengthAttribute(MaxLen = 100)
        public String CName;

        /**
         * 产品组唯一标识
         */
        @NotNullAttribute
        @LengthAttribute(MaxLen = 30)
        public String ProductGroup;

        /**
         * 产品组存的业务ID
         */
        @NotNullAttribute
        @LengthAttribute(MaxLen = 30)
        public String ProductBllID;

        /**
         * 模板纸张
         */
        @FrekeyAttribute(Name = "JRTPrintPaper", RefColumnName = "RowID", AssociaField = "CName")
        @LengthAttribute(MaxLen = 10)
        public Integer JRTPrintPaperDR;

        /**
         * 边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double ResultLineSpacing;

        /**
         * 结果行数
         */
        @LengthAttribute(MaxLen = 10)
        public Integer ResultRows;

        /**
         * 结果列
         */
        @LengthAttribute(MaxLen = 10)
        public Integer ResultCols;

        /**
         * 纸张方向
         */
        @LengthAttribute(MaxLen = 10)
        public String PaperLayout;

        /**
         * 下边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double PaperBottom;

        /**
         * 左边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double PaperLeft;

        /**
         * 右边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double PaperRight;

        /**
         * 上边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double PaperTop;

        /**
         * 微生物边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double MicResultLineSpacing;

        /**
         * 微生物行数
         */
        @LengthAttribute(MaxLen = 10)
        public Integer MicResultRows;

        /**
         * 微生物列数
         */
        @LengthAttribute(MaxLen = 10)
        public Integer MicResultCols;

        /**
         * 边距
         */
        @LengthAttribute(MaxLen = 10)
        public Double ArchivesMargin;

        /**
         * 双列填充类型
         */
        @LengthAttribute(MaxLen = 10)
        public String DoubleColFillType;

        /**
         * 序号
         */
        @LengthAttribute(MaxLen = 10)
        public Integer Sequence;

        /**
         * 父模板
         */
        @FrekeyAttribute(Name = "JRTPrintTemplate", RefColumnName = "RowID", AssociaField = "CName")
        @LengthAttribute(MaxLen = 10)
        public Integer ParentTemplateDR;

        /**
         * 截止日期
         */
        @JsonSerialize(using = JRTDateSerializer.class)
        @JsonDeserialize(using = JRTDateDeserializer.class)
        @DateAttribute
        @LengthAttribute(MaxLen = 10)
        public Integer EndDate;

        /**
         * 截止时间
         */
        @JsonSerialize(using = JRTTimeSerializer.class)
        @JsonDeserialize(using = JRTTimeDeserializer.class)
        @TimeAttribute
        @LengthAttribute(MaxLen = 10)
        public Integer EndTime;

        /**
         * 截止说明
         */
        @LengthAttribute(MaxLen = 50)
        public String EndRemark;

}

新代码:

-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------
JRT/Model/Entity/JRTTask.java代码不一致
老代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_Task")
public class JRTTask
{
    /**
     * 主键
     */
    @NotNullAttribute
    @IdAttribute(Name = "RowID")
    @LengthAttribute(MaxLen = 10)
    public int RowID;

    /**
     * 代码
     */
    @NotNullAttribute
    @LengthAttribute(MaxLen = 20)
    public String Code;

    /**
     * 名称
     */
    @LengthAttribute(MaxLen = 50)
    public String CName;

    /**
     * 说明
     */
    @LengthAttribute(MaxLen = 100)
    public String Description;

    /**
     * 类型:SYS,USR
     */
    @LengthAttribute(MaxLen = 5)
    public String Type;

    /**
     * 执行脚本类
     */
    @LengthAttribute(MaxLen = 100)
    public String ScriptClass;

    /**
     * 执行脚本方法
     */
    @LengthAttribute(MaxLen = 30)
    public String ScriptMethod;

    /**
     * 优先级别:0:Normal, 1:Low, 2:High
     */
    @LengthAttribute(MaxLen = 1)
    public String Priority;

    /**
     * 是否有效
     */
    @LengthAttribute(MaxLen = 10)
    public Boolean Active;

    /**
     * 启用日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer StartDate;

    /**
     * 结束日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer EndDate;

    /**
     * 任务周期类型:D(按天),W(按周),M(按月)
     */
    @LengthAttribute(MaxLen = 1)
    public String ScheduleType;

    /**
     * 任务周期间隔
     */
    @LengthAttribute(MaxLen = 10)
    public Integer ScheduleStep;

    /**
     * 任务周期内执行天数列表
     */
    @LengthAttribute(MaxLen = 100)
    public String ScheduleList;

    /**
     * 任务运行频率:0:一次,1:重复
     */
    @LengthAttribute(MaxLen = 1)
    public Integer ScheduleFrequency;

    /**
     * 任务运行频率时间
     */
    @LengthAttribute(MaxLen = 10)
    public Integer FrequencyTime;

    /**
     * 任务启动地址
     */
    @LengthAttribute(MaxLen = 200)
    public String RunAdddress;

}

新代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_Task")
public class JRTTask
{
    /**
     * 主键
     */
    @NotNullAttribute
    @IdAttribute(Name = "RowID")
    @LengthAttribute(MaxLen = 10)
    public int RowID;

    /**
     * 代码
     */
    @NotNullAttribute
    @LengthAttribute(MaxLen = 20)
    public String Code;

    /**
     * 名称
     */
    @LengthAttribute(MaxLen = 50)
    public String CName;

    /**
     * 说明
     */
    @LengthAttribute(MaxLen = 100)
    public String Description;

    /**
     * 类型:SYS,USR
     */
    @LengthAttribute(MaxLen = 5)
    public String Type;

    /**
     * 执行脚本类
     */
    @LengthAttribute(MaxLen = 100)
    public String ScriptClass;

    /**
     * 执行脚本方法
     */
    @LengthAttribute(MaxLen = 30)
    public String ScriptMethod;

    /**
     * 优先级别:0:Normal, 1:Low, 2:High
     */
    @LengthAttribute(MaxLen = 1)
    public String Priority;

    /**
     * 是否有效
     */
    @LengthAttribute(MaxLen = 10)
    public Boolean Active;

    /**
     * 启用日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer StartDate;

    /**
     * 结束日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer EndDate;

    /**
     * 任务周期类型:D(按天),W(按周),M(按月)
     */
    @LengthAttribute(MaxLen = 1)
    public String ScheduleType;

    /**
     * 任务周期间隔
     */
    @LengthAttribute(MaxLen = 10)
    public Integer ScheduleStep;

    /**
     * 任务周期内执行天数列表
     */
    @LengthAttribute(MaxLen = 100)
    public String ScheduleList;

    /**
     * 任务运行频率:0:一次,1:重复
     */
    @LengthAttribute(MaxLen = 1)
    public Integer ScheduleFrequency;

    /**
     * 任务运行频率时间
     */
    @LengthAttribute(MaxLen = 10)
    public Integer FrequencyTime;

    /**
     * 任务启动地址
     */
    @LengthAttribute(MaxLen = 200)
    public String RunAdddress1;

}

-------------------------------------------------------------------------------------------------------

******************************************************************************************
以下实体是老代码没有的,新代码有的实体
-------------------------------------------------------------------------------------------------------
新代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_Task")
public class JRTTask1
{
    /**
     * 主键
     */
    @NotNullAttribute
    @IdAttribute(Name = "RowID")
    @LengthAttribute(MaxLen = 10)
    public int RowID;

    /**
     * 代码
     */
    @NotNullAttribute
    @LengthAttribute(MaxLen = 20)
    public String Code;

    /**
     * 名称
     */
    @LengthAttribute(MaxLen = 50)
    public String CName;

    /**
     * 说明
     */
    @LengthAttribute(MaxLen = 100)
    public String Description;

    /**
     * 类型:SYS,USR
     */
    @LengthAttribute(MaxLen = 5)
    public String Type;

    /**
     * 执行脚本类
     */
    @LengthAttribute(MaxLen = 100)
    public String ScriptClass;

    /**
     * 执行脚本方法
     */
    @LengthAttribute(MaxLen = 30)
    public String ScriptMethod;

    /**
     * 优先级别:0:Normal, 1:Low, 2:High
     */
    @LengthAttribute(MaxLen = 1)
    public String Priority;

    /**
     * 是否有效
     */
    @LengthAttribute(MaxLen = 10)
    public Boolean Active;

    /**
     * 启用日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer StartDate;

    /**
     * 结束日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer EndDate;

    /**
     * 任务周期类型:D(按天),W(按周),M(按月)
     */
    @LengthAttribute(MaxLen = 1)
    public String ScheduleType;

    /**
     * 任务周期间隔
     */
    @LengthAttribute(MaxLen = 10)
    public Integer ScheduleStep;

    /**
     * 任务周期内执行天数列表
     */
    @LengthAttribute(MaxLen = 100)
    public String ScheduleList;

    /**
     * 任务运行频率:0:一次,1:重复
     */
    @LengthAttribute(MaxLen = 1)
    public Integer ScheduleFrequency;

    /**
     * 任务运行频率时间
     */
    @LengthAttribute(MaxLen = 10)
    public Integer FrequencyTime;

    /**
     * 任务启动地址
     */
    @LengthAttribute(MaxLen = 200)
    public String RunAdddress;

}

-------------------------------------------------------------------------------------------------------

当前使用的实体和代码有3个差异,请比对后再编译

D:\JRTPlan\WebLoader\WebSrc\webapps\JRTWeb\CompileModel>

整合进入jrt命令

[root@localhost ~]# jrt
欢迎使用jrt的linux命令呼出入口,通过jrt命令引导bash脚本
执行命令:bash /jrtbase/jrt.sh
 
+欢迎您使用jrt网站运维脚本
+该脚本致力于简化基于jrt框架的web在linux上运维
+常用菜单选项有1、2
+检验约定发布在8080端口
+在没有jrt命令的检验服务器运行bash /jrtbase/jrt.sh来第一次初始化jrt命令
 
 
+*************************************************JRTWeb网站配置工具************************************************************+
+                                                                                                                               +
+ 1:重启Tomcat网站                                                                                                             +
+                                                                                                                               +
+ 2:端口查看和开放,查看端口占用(lsof -i:8080)                                                                                   +
+                                                                                                                               +
+ 3:查看网站进程信息                                                                                                            +
+                                                                                                                               +
+ 8:编译实体                                                                                                                    +
+                                                                                                                               +
+ 9:常用命令帮助                                                                                                                +
+                                                                                                                               +
+ 10:启动rsync服务                                                                                                              +
+                                                                                                                               +
+ 11:停止Tomcat网站                                                                                                             +
+                                                                                                                               +
+ 18:实体编译测试和代码比对                                                                                          +
+                                                                                                                               +
+ 发布后系统访问地址http://127.0.0.1:8080/JRTWeb/login/form/Login.aspx                                                          +
+                                                                                                              小乌鱼 20231228  +
+*******************************************************************************************************************************+
请按菜单输入选择功能Ctrl+C退出:18
开始编译/jrtbase/webapps/JRTWeb/CompileModel的实体代码
执行命令:java -cp /jrtbase/webapps/JRTWeb/CompileModel BuildModel JRT.Model
开始编译实体...
jar包路径:/jrtbase/lib/
查找:/jrtbase/webapps/JRTWeb/CompileModel/JRT.Model下的.java文件
找到:8个.java文件
执行编译:71

编译结束返回:1
开始比对/jrtbase/webapps/JRTWeb/CompileModel的实体代码
执行命令:java -cp /jrtbase/webapps/JRTWeb/CompileModel BuildModel JRT.Model compare
jar包路径:/jrtbase/lib/
-------------------------------------------------------------------------------------------------------
JRT/Model/Entity/JRTPrintTemplate.java代码不一致
老代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
/**
 *[功能描述:本代码由LIS内部代码生成工具生成,请不要手动修改,如要修改,请写修改变更记录]
 *[创建者:JRT.Entity生成器]
 */
@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_PrintTemplate")
public class JRTPrintTemplate
{
	/**
	 * 主键
	 */
	@NotNullAttribute
	@IdAttribute(Name = "RowID")
	@LengthAttribute(MaxLen = 10)
	public int RowID;

	/**
	 * 模板代码
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 100)
	public String Code;

	/**
	 * 模板名称
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 100)
	public String CName;

	/**
	 * 产品组唯一标识
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 30)
	public String ProductGroup;

	/**
	 * 产品组存的业务ID
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 30)
	public String ProductBllID;

	/**
	 * 模板纸张
	 */
	@FrekeyAttribute(Name = "JRTPrintPaper", RefColumnName = "RowID", AssociaField = "CName")
	@LengthAttribute(MaxLen = 10)
	public Integer JRTPrintPaperDR;

	/**
	 * 边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double ResultLineSpacing;

	/**
	 * 结果行数
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer ResultRows;

	/**
	 * 结果列
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer ResultCols;

	/**
	 * 纸张方向
	 */
	@LengthAttribute(MaxLen = 10)
	public String PaperLayout;

	/**
	 * 下边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperBottom;

	/**
	 * 左边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperLeft;

	/**
	 * 右边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperRight;

	/**
	 * 上边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperTop;

	/**
	 * 微生物边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double MicResultLineSpacing;

	/**
	 * 微生物行数
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer MicResultRows;

	/**
	 * 微生物列数
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer MicResultCols;

	/**
	 * 边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double ArchivesMargin;

	/**
	 * 双列填充类型
	 */
	@LengthAttribute(MaxLen = 10)
	public String DoubleColFillType;

	/**
	 * 序号
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer Sequence;

	/**
	 * 父模板
	 */
	@FrekeyAttribute(Name = "JRTPrintTemplate", RefColumnName = "RowID", AssociaField = "CName")
	@LengthAttribute(MaxLen = 10)
	public Integer ParentTemplateDR;

	/**
	 * 截止日期
	 */
	@JsonSerialize(using = JRTDateSerializer.class)
	@JsonDeserialize(using = JRTDateDeserializer.class)
	@DateAttribute
	@LengthAttribute(MaxLen = 10)
	public Integer EndDate;

	/**
	 * 截止时间
	 */
	@JsonSerialize(using = JRTTimeSerializer.class)
	@JsonDeserialize(using = JRTTimeDeserializer.class)
	@TimeAttribute
	@LengthAttribute(MaxLen = 10)
	public Integer EndTime;

	/**
	 * 截止说明
	 */
	@LengthAttribute(MaxLen = 50)
	public String EndRemark;

}

新代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
/**
*[功能描述:本代码由LIS内部代码生成工具生成,请不要手动修改,如要修改,请写修改变更记录]
*[创建者:JRT.Entity生成器]
*/
@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_PrintTemplate")
public class JRTPrintTemplate
{
	/**
	* 主键
	*/
	@NotNullAttribute
	@IdAttribute(Name = "RowID")
	@LengthAttribute(MaxLen = 10)
	public int RowID;

	/**
	* 模板代码
	*/
	@NotNullAttribute
	@LengthAttribute(MaxLen = 100)
	public String Code;

	/**
	* 模板名称
	*/
	@NotNullAttribute
	@LengthAttribute(MaxLen = 100)
	public String CName;

	/**
	* 产品组唯一标识
	*/
	@NotNullAttribute
	@LengthAttribute(MaxLen = 30)
	public String ProductGroup;

	/**
	* 产品组存的业务ID
	*/
	@NotNullAttribute
	@LengthAttribute(MaxLen = 30)
	public String ProductBllID;

	/**
	* 模板纸张
	*/
	@FrekeyAttribute(Name = "JRTPrintPaper", RefColumnName = "RowID", AssociaField = "CName")
	@LengthAttribute(MaxLen = 10)
	public Integer JRTPrintPaperDR;

	/**
	* 边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double ResultLineSpacing;

	/**
	* 结果行数
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer ResultRows;

	/**
	* 结果列
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer ResultCols;

	/**
	* 纸张方向
	*/
	@LengthAttribute(MaxLen = 10)
	public String PaperLayout;

	/**
	* 下边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double PaperBottom;

	/**
	* 左边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double PaperLeft;

	/**
	* 右边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double PaperRight;

	/**
	* 上边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double PaperTop;

	/**
	* 微生物边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double MicResultLineSpacing;

	/**
	* 微生物行数
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer MicResultRows;

	/**
	* 微生物列数
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer MicResultCols;

	/**
	* 边距
	*/
	@LengthAttribute(MaxLen = 10)
	public Double ArchivesMargin;

	/**
	* 双列填充类型
	*/
	@LengthAttribute(MaxLen = 10)
	public String DoubleColFillType;

	/**
	* 序号
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer Sequence;

	/**
	* 父模板
	*/
	@FrekeyAttribute(Name = "JRTPrintTemplate", RefColumnName = "RowID", AssociaField = "CName")
	@LengthAttribute(MaxLen = 10)
	public Integer ParentTemplateDR;

	/**
	* 截止日期  
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer EndDate;

	/**
	* 截止时间  
	*/
	@LengthAttribute(MaxLen = 10)
	public Integer EndTime;

	/**
	* 截止说明
	*/
	@LengthAttribute(MaxLen = 50)
	public String EndRemark;

}

-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------
JRT/Model/Entity/JRTTask.java代码不一致
老代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_Task")
public class JRTTask
{
    /**
     * 主键
     */
    @NotNullAttribute
    @IdAttribute(Name = "RowID")
    @LengthAttribute(MaxLen = 10)
    public int RowID;

    /**
     * 代码
     */
    @NotNullAttribute
    @LengthAttribute(MaxLen = 20)
    public String Code;

    /**
     * 名称
     */
    @LengthAttribute(MaxLen = 50)
    public String CName;

    /**
     * 说明
     */
    @LengthAttribute(MaxLen = 100)
    public String Description;

    /**
     * 类型:SYS,USR
     */
    @LengthAttribute(MaxLen = 5)
    public String Type;

    /**
     * 执行脚本类
     */
    @LengthAttribute(MaxLen = 100)
    public String ScriptClass;

    /**
     * 执行脚本方法
     */
    @LengthAttribute(MaxLen = 30)
    public String ScriptMethod;

    /**
     * 优先级别:0:Normal, 1:Low, 2:High
     */
    @LengthAttribute(MaxLen = 1)
    public String Priority;

    /**
     * 是否有效
     */
    @LengthAttribute(MaxLen = 10)
    public Boolean Active;

    /**
     * 启用日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer StartDate;

    /**
     * 结束日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer EndDate;

    /**
     * 任务周期类型:D(按天),W(按周),M(按月)
     */
    @LengthAttribute(MaxLen = 1)
    public String ScheduleType;

    /**
     * 任务周期间隔
     */
    @LengthAttribute(MaxLen = 10)
    public Integer ScheduleStep;

    /**
     * 任务周期内执行天数列表
     */
    @LengthAttribute(MaxLen = 100)
    public String ScheduleList;

    /**
     * 任务运行频率:0:一次,1:重复
     */
    @LengthAttribute(MaxLen = 1)
    public Integer ScheduleFrequency;

    /**
     * 任务运行频率时间
     */
    @LengthAttribute(MaxLen = 10)
    public Integer FrequencyTime;

    /**
     * 任务启动地址
     */
    @LengthAttribute(MaxLen = 200)
    public String RunAdddress;

}

新代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_Task")
public class JRTTask
{
    /**
     * 主键
     */
    @NotNullAttribute
    @IdAttribute(Name = "RowID")
    @LengthAttribute(MaxLen = 10)
    public int RowID;

    /**
     * 代码
     */
    @NotNullAttribute
    @LengthAttribute(MaxLen = 20)
    public String Code;

    /**
     * 名称
     */
    @LengthAttribute(MaxLen = 50)
    public String CName;

    /**
     * 说明
     */
    @LengthAttribute(MaxLen = 100)
    public String Description;

    /**
     * 类型:SYS,USR
     */
    @LengthAttribute(MaxLen = 5)
    public String Type;

    /**
     * 执行脚本类
     */
    @LengthAttribute(MaxLen = 100)
    public String ScriptClass;

    /**
     * 执行脚本方法
     */
    @LengthAttribute(MaxLen = 30)
    public String ScriptMethod;

    /**
     * 优先级别:0:Normal, 1:Low, 2:High
     */
    @LengthAttribute(MaxLen = 1)
    public String Priority;

    /**
     * 是否有效
     */
    @LengthAttribute(MaxLen = 10)
    public Boolean Active;

    /**
     * 启用日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer StartDate;

    /**
     * 结束日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer EndDate;

    /**
     * 任务周期类型:D(按天),W(按周),M(按月)
     */
    @LengthAttribute(MaxLen = 1)
    public String ScheduleType;

    /**
     * 任务周期间隔
     */
    @LengthAttribute(MaxLen = 10)
    public Integer ScheduleStep;

    /**
     * 任务周期内执行天数列表
     */
    @LengthAttribute(MaxLen = 100)
    public String ScheduleList;

    /**
     * 任务运行频率:0:一次,1:重复
     */
    @LengthAttribute(MaxLen = 1)
    public Integer ScheduleFrequency;

    /**
     * 任务运行频率时间
     */
    @LengthAttribute(MaxLen = 10)
    public Integer FrequencyTime;

    /**
     * 任务启动地址
     */
    @LengthAttribute(MaxLen = 200)
    public String RunAdddress1;

}

-------------------------------------------------------------------------------------------------------

******************************************************************************************
以下实体是老代码没有的,新代码有的实体
-------------------------------------------------------------------------------------------------------
新代码:
package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_Task")
public class JRTTask1
{
    /**
     * 主键
     */
    @NotNullAttribute
    @IdAttribute(Name = "RowID")
    @LengthAttribute(MaxLen = 10)
    public int RowID;

    /**
     * 代码
     */
    @NotNullAttribute
    @LengthAttribute(MaxLen = 20)
    public String Code;

    /**
     * 名称
     */
    @LengthAttribute(MaxLen = 50)
    public String CName;

    /**
     * 说明
     */
    @LengthAttribute(MaxLen = 100)
    public String Description;

    /**
     * 类型:SYS,USR
     */
    @LengthAttribute(MaxLen = 5)
    public String Type;

    /**
     * 执行脚本类
     */
    @LengthAttribute(MaxLen = 100)
    public String ScriptClass;

    /**
     * 执行脚本方法
     */
    @LengthAttribute(MaxLen = 30)
    public String ScriptMethod;

    /**
     * 优先级别:0:Normal, 1:Low, 2:High
     */
    @LengthAttribute(MaxLen = 1)
    public String Priority;

    /**
     * 是否有效
     */
    @LengthAttribute(MaxLen = 10)
    public Boolean Active;

    /**
     * 启用日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer StartDate;

    /**
     * 结束日期
     */
    @JsonSerialize(using = JRTDateSerializer.class)
    @JsonDeserialize(using = JRTDateDeserializer.class)
    @LengthAttribute(MaxLen = 10)
    public Integer EndDate;

    /**
     * 任务周期类型:D(按天),W(按周),M(按月)
     */
    @LengthAttribute(MaxLen = 1)
    public String ScheduleType;

    /**
     * 任务周期间隔
     */
    @LengthAttribute(MaxLen = 10)
    public Integer ScheduleStep;

    /**
     * 任务周期内执行天数列表
     */
    @LengthAttribute(MaxLen = 100)
    public String ScheduleList;

    /**
     * 任务运行频率:0:一次,1:重复
     */
    @LengthAttribute(MaxLen = 1)
    public Integer ScheduleFrequency;

    /**
     * 任务运行频率时间
     */
    @LengthAttribute(MaxLen = 10)
    public Integer FrequencyTime;

    /**
     * 任务启动地址
     */
    @LengthAttribute(MaxLen = 200)
    public String RunAdddress;

}

-------------------------------------------------------------------------------------------------------

当前使用的实体和代码有3个差异,请比对后再编译
+*************************************************JRTWeb网站配置工具************************************************************+
+                                                                                                                               +
+ 1:重启Tomcat网站                                                                                                             +
+                                                                                                                               +
+ 2:端口查看和开放,查看端口占用(lsof -i:8080)                                                                                   +
+                                                                                                                               +
+ 3:查看网站进程信息                                                                                                            +
+                                                                                                                               +
+ 8:编译实体                                                                                                                    +
+                                                                                                                               +
+ 9:常用命令帮助                                                                                                                +
+                                                                                                                               +
+ 10:启动rsync服务                                                                                                              +
+                                                                                                                               +
+ 11:停止Tomcat网站                                                                                                             +
+                                                                                                                               +
+ 18:实体编译测试和代码比对                                                                                          +
+                                                                                                                               +
+ 发布后系统访问地址http://127.0.0.1:8080/JRTWeb/login/form/Login.aspx                                                          +
+                                                                                                              小乌鱼 20231228  +
+*******************************************************************************************************************************+
请按菜单输入选择功能Ctrl+C退出:

实体编译的问题就完全解决了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 | 如何使用 Seaborn 提升数据分析效率

Seaborn和Matplotlib都是Python可视化库&#xff0c;它们都可以用于创建各种类型的图表。但是&#xff0c;Seaborn 和Matplotlib在概念和设计上有一些不同。 Matplotlib虽然已经是比较优秀的绘图库了&#xff0c;但是它有个今人头疼的问题&#xff0c;那就是API使用过于复杂&am…

Blender教程(基础)-物体的移动、旋转与缩放-04

一、新建一个立方体 ShiftA新建一个立方体用来演示。 二、物体的移动 xyz轴移动 点击下图图左侧的移动选项后&#xff0c;选中要移动的物体&#xff0c;会出现三个箭头的方向&#xff0c;这分别代表沿着x、y、z轴移动。xyz平面移动 这个小正方体代表沿着某一个面移动&#…

04.领域驱动设计:了解聚合和聚合根,怎样设计聚合

目录 1、概述 2、聚合 3、聚合根 4、怎么设计聚合 4.1 聚合的构建过程主要步骤 第 1 步&#xff1a;采用事件风暴。 第 2 步&#xff1a;选出聚合根。 第 3 步&#xff1a;找出与聚合根关联的所有紧密依赖的实体和值对象。 第 4 步&#xff1a;画出对象的引用和依赖模型…

vue3框架基本使用

一、安装包管理工具 vite和vue-cli一样&#xff0c;都是脚手架。 1.node版本 PS E:\vuecode\vite1> node -v v18.12.12.安装yarn工具 2.1 yarn简单介绍 yarn是一个包管理工具&#xff0c;也是一个构建、打包工具 yarn需要借助npm进行安装&#xff1a;执行的命令行npm i…

找不同-《企业应用架构模式》2024典藏版

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下是2004年《企业应用架构模式》中译本和2024年《企业应用架构模式》典藏版译本的页面。 您能从中找出至少10处不同吗&#xff1f; 如何选择UMLChina服务 UMLChina公众号精选&…

Blender教程(基础)-面的细分与删除、挤出选区-07

一、Blender之面的细分 新建一个立方体&#xff0c;在编辑模式下、选中一个面。 在选中的面上单击右键弹出细分选项&#xff0c;选择细分。 在选中细分后、会默认细分1次。修改细分次数在左下角 二、Blender之面的删除 选择中需要操作的面&#xff0c;在英文状态下按X键弹…

VSCode 1.85.0更新的3个实用功能

1、单个文件可直接拖拽为独立窗口 当单文件过长&#xff0c;直接分成两个视图就不用上下频繁滚动 2、将终端移动到编辑器区域 此时&#xff0c;终端也可像文件一样拖拽为独立窗口 3、文件夹目录粘性头部 默认关闭&#xff0c;需要设置 "workbench.tree.enableStickyScro…

Linux权限的概念,shell命令以及运行原理

目录 1.shell命令以及运行原理2.Linux权限2.1Linux中的两类用户2.2Linux权限管理2.2.1文件访问者的分类&#xff08;人&#xff09;2.2.2文件类型和访问权限&#xff08;事物属性&#xff09;2.2.3文件的类型以及权限的缩写2.2.4文件权限值的表示方法2.2.5文件访问权限的相关设…

HTML 曲线图表特效

下面是代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>基于 ApexCharts 的 HTML5 曲线图表DEMO演示</title><style> body {background: #000524; }#wrapper {padding-top: 20px;background: #000524;b…

opencv#33 边缘检测

边缘检测原理 图像的每一行每一列都可以看成是一个连续的信号经过离散后得到的数值&#xff0c;例如上图左侧给出的图像由黑色到白色的一个信号&#xff0c;也就是图像中某一行像素变化是由黑色逐渐到白色&#xff0c;我们将其对应在一个坐标轴中&#xff0c;将像素值的大小对应…

sysfs: cannot create duplicate filename ‘/devices/virtual/leds/led1‘问题查找及解决

问题描述&#xff1a;安装模块时出现如下错误&#xff1a; [rootVinxin_PC leds]# cd /driver_Test/ [rootVinxin_PC driver_Test]# ls app leds-s5pv210.ko [rootVinxin_PC driver_Test]# lsmod Module Size Used by Not tainted [rootVin…

最全全国十七个数据入表和资产化案例深度解析

2024年1月1日起&#xff0c;财政部会计司发布的《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;规定为数据资源的会计处理提供了明确的指导原则。这一里程碑事件也标志着我国在数据资产入表领域正式进入实际操作阶段&#xff0c;随后&#xff0c;数据资产入表在全国…

stable diffusion学习笔记——文生图(一)

模型设置 基本模型 基本模型也就是常说的checkpoint&#xff08;大模型&#xff09;&#xff0c;基本模型决定了生成图片的主体风格。 如上图所示&#xff0c;基本模型的后缀为.safetensors。需要存放在特定的文件夹下。 如果用的是启动器&#xff0c;可以在启动器内直接下载。…

2024年黑龙江省安全员C证证考试题库及黑龙江省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年黑龙江省安全员C证证考试题库及黑龙江省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考…

(java)idel中将对与json的相互转

1、目录结构 2、导入包 在模块下面建立lib目录将包导入模块中 包的百度网盘 链接&#xff1a;https://pan.baidu.com/s/1abNF8cOTeNb00rM7tp04iQ?pwd39wc 提取码&#xff1a;39wc 3、建立两个测试类person和dog类 public class Dog {private String name;private int age…

STM32标准库——(5)EXTI外部中断

1.中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中断优先级&#xff…

CMake 完整入门教程(一)

1 前言 每一次学习新东西都是很有乐趣的&#xff0c;虽然刚开始会花费时间用来学习&#xff0c;但是实践证明&#xff0c;虽然学习新东西可能会花费一些时间&#xff0c;但是它们带来的好处会远远超过这些花费的时间。学习新东西是值得的&#xff0c;也是很有乐趣的。 网络上…

六、Kotlin 类型进阶

1. 类的构造器 & init 代码块 1.1 主构造器 & 副构造器在使用时的注意事项 & 注解 JvmOverloads 推荐在类定义时为类提供一个主构造器&#xff1b; 在为类提供了主构造器的情况下&#xff0c;当再定义其他的副构造器时&#xff0c;要求副构造器必须调用到主构造器…

安全防御{第三次作业(在第二次作业上添加点需求)}

目录 需求&#xff1a; 拓扑图&#xff1a; 注意&#xff1a;先打开防火墙web界面&#xff0c;在此不做演示 1.要求一&#xff1a;&#xff0c;生产区在工作时间内可以访问服务器区&#xff0c;仅可以访问http服务器 2.要求二&#xff1a;办公区全天可以访问服务器区&#…

RISC-V RVWMO 内存模型解释

RISC-V RVWMO 内存模型解释 引言 本文介绍 RISC-V RVWMO 内存模型。RVWMO 内存模型定义了什么样的全局内存顺序才是合法的。本引言部分将解释为什么会出现不合法的全局内存顺序&#xff0c;以及为什么需要内存模型。 首先引起乱序的全局内存顺序&#xff08;指令重排序&…