从零构建可视化jar包部署平台JarManage教程

 更新时间:2023年05月15日 11:39:32   作者:code2roc  
这篇文章主要为大家介绍了从零构建可视化jar包部署平台JarManage教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

项目背景

在java项目部署过程中,由于内外部各种因素,可能会遇到一些感觉操作不便捷的场景,例如

  • jar包未随系统自动启动需要每次手动重启
  • 系统vpn堡垒机多重防御更新繁琐
  • 系统无图形化界面命令行操作复杂
  • 等等......

在工作中之前也总结了windows的Jar包部署工具linux下的jar包自动化部署脚本,这次就想着否能将二者统一结合,本着简单/高效/功能专一的原则,做出一

个可视化jar包部署平台,JarManage应运而生

功能介绍

项目地址:https://gitee.com/code2roc/jar-manage

支持在线创建项目,上传Jar包,自动备份,配置启动参数,注册系统服务,查看启动日志等功能,具有以下优点

  • 基于servlet开发,依赖简洁,部署包10MB左右
  • 结合嵌入式tomcat一键部署,无外部容器依赖
  • 使用h2db存储数据,无外部数据库依赖
  • 适配windows/linux平台,满足多种环境
  • 具体项目经平台部署后自动注册系统服务,无需担心服务器重启

系统架构图如下

系统截图展示

技术分析

平台识别

首先通过系统os识别是windows平台还是linux平台

String os = System.getProperty("os.name").toLowerCase();
if (os.startsWith("win")) {
   platform = DepolyPlatform.Windows;
}

通过system-release文件识别部分基于CentOS开发的Linux系统

String command = "cat /etc/system-release";
String result = CMDUtil.executeLinuxCommand(command);
if (result.startsWith("Red Hat")) {
   platform = DepolyPlatform.LinuxRedHat;
} else if (result.startsWith("CentOS")) {
   platform = DepolyPlatform.LinuxCentOS;
} else if (result.startsWith("openEuler")) {
   platform = DepolyPlatform.LinuxOpenEuler;
}

通过issue文件识别部分基于Ubuntu/Debian开发的Linux系统

command = "cat /etc/issue";
result = CMDUtil.executeLinuxCommand(command);
if (!StringUtil.isEmpty(result)) {
  if (result.startsWith("Ubuntu")) {
     platform = DepolyPlatform.LinuxUbuntu;
} else if (result.startsWith("Debian")) {
      platform = DepolyPlatform.LinuxDebian;
   }
}

windows注册服务

通过sc query命令判断服务状态

public String getStatus(String serviceName) {
        String status = DepolyStatus.UnInstall;
        try {
            String command = "sc query " + serviceName;
            String commandResultFilePath = CMDUtil.executeWindowCommandStoreFile(command);
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(commandResultFilePath)));
            String line = reader.readLine();
            while (line != null) {
                if (line.trim().startsWith("STATE")) {
                    if (line.trim().substring(line.trim().indexOf(":") + 1, line.trim().indexOf(":") + 4).trim().equals("1"))
                        status = DepolyStatus.Stopped;
                    else if (line.trim().substring(line.trim().indexOf(":") + 1, line.trim().indexOf(":") + 4).trim().equals("2"))
                        status = DepolyStatus.Startting;
                    else if (line.trim().substring(line.trim().indexOf(":") + 1, line.trim().indexOf(":") + 4).trim().equals("3"))
                        status = DepolyStatus.Stopping;
                    else if (line.trim().substring(line.trim().indexOf(":") + 1, line.trim().indexOf(":") + 4).trim().equals("4"))
                        status = DepolyStatus.Running;
                }
                line = reader.readLine();
            }
        } catch (IOException e) {
            LogUtil.error(e);
        }
        return status;
    }

通过winsw这个开源项目配置exe和xml文件将jar包注册为windows服务,项目地址:https://github.com/winsw/winsw/

linux注册服务

通过systemctl status命令判断服务状态

public String getStatus(String serviceName) {
        String status = DepolyStatus.UnInstall;
        try {
            String command = "systemctl status " + serviceName;
            String commandResultFilePath = CMDUtil.executeLinuxCommandWithStore(command);
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(commandResultFilePath)));
            String line = reader.readLine();
            while (line != null) {
                if (line.trim().startsWith("Active")) {
                    if (line.trim().indexOf("inactive (dead)") > 0)
                        status = DepolyStatus.Stopped;
                    else if (line.trim().indexOf("active (running)") > 0)
                        status = DepolyStatus.Running;
                    else if (line.trim().indexOf("failed") > 0)
                        status = DepolyStatus.Stopped;
                }
                line = reader.readLine();
            }
        } catch (IOException e) {
            LogUtil.error(e);
        }
        return status;
    }

通过拷贝service文件到systemd/system目录下注册linux服务

yml配置文件识别

  • maven配置
<dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.26</version>
        </dependency>
  • 配置文件
jarmanage:
  port: 8555
  username: admin
  password: abcd@1234
  backupcount: 5
  • 工具类
public static String getConfigValue(String configName){
        String configValue = "";
        try{
            Yaml yaml = new Yaml();
            InputStream resourceAsStream = new FileInputStream(new File("resources"+File.separator+"application.yml"));
            Map obj = yaml.load(resourceAsStream);
            Map<String,Object> param = (Map) obj.get("jarmanage");
            configValue = ConvertUtil.convert2String(param.get(configName));
        }catch (Exception e){
            LogUtil.error(e);
        }
        return configValue;
    }

h2database使用

  • maven引用
<dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.1.214</version>
        </dependency>
  • 工具类
public static Connection getConnection() throws Exception {
        File file = new File("database");
        Connection conn = DriverManager.getConnection("jdbc:h2:file:" + file.getAbsolutePath() + File.separator + "manage", "root", "abcd@1234");
        return conn;
    }
    public static void executeSQL(String sql) {
        try {
            Connection conn = getConnection();
            Statement stmt = conn.createStatement();
            stmt.execute(sql);
            stmt.close();
            conn.close();
        } catch (Exception e) {
            LogUtil.error(e);
        }
    }

servelt内置tomcat打包

  • maven引用
<dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>9.0.35</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
            <version>9.0.35</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>9.0.35</version>
        </dependency>
  • 手动启动
//启动tomcat服务
            // 1.创建一个内嵌的Tomcat
            Tomcat tomcat = new Tomcat();
            // 2.设置Tomcat端口
            tomcat.setPort(8555);
            // 3.设置工作目录,tomcat需要使用这个目录进行写一些东西
            final String baseDir = "workspace" + File.separator;
            tomcat.setBaseDir(baseDir);
            tomcat.getHost().setAutoDeploy(false);
            // 4. 设置webapp资源路径
            String webappDirLocation = "webapp" + File.separator;
            StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
            // 5. 设置上下文路每径
            String contextPath = "";
            ctx.setPath(contextPath);
            ctx.addLifecycleListener(new Tomcat.FixContextListener());
            ctx.setName("jar-manage");
            tomcat.getHost().addChild(ctx);
            //6.启动
            tomcat.getConnector();
            tomcat.start();
            tomcat.getServer().await();
  • 打包包含引用类库,自定义配置xml,指定运行class
<plugins>
            <plugin>
                <!-- 打包包含引用 -->
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptors>
                        <!-- 自定义配置 -->
                        <descriptor>package.xml</descriptor>
                    </descriptors>
                    <archive>
                        <manifest>
                            <!-- 运行类 -->
                            <mainClass>com.code2roc.jarmanage.Application</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.1"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.1 https://maven.apache.org/xsd/assembly-2.1.1.xsd">
    <!-- TODO: a jarjar format would be better -->
    <id>depoly</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>src/main/webapp/</directory>
            <outputDirectory>/webapp</outputDirectory>
            <includes>
                <include>**/**</include>
            </includes>
        </fileSet>

以上就是从零构建可视化jar包部署平台JarManage的详细内容,更多关于从零构建可视化jar包部署平台JarManage的资料请关注脚本之家其它相关文章!

相关文章

  • 关于springboot中对sqlSessionFactoryBean的自定义

    关于springboot中对sqlSessionFactoryBean的自定义

    这篇文章主要介绍了springboot中对sqlSessionFactoryBean的自定义方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 启动Solr提示Java版本低问题解决方案

    启动Solr提示Java版本低问题解决方案

    这篇文章主要介绍了启动Solr提示Java版本低问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 实例讲解java定时任务

    实例讲解java定时任务

    这篇文章主要介绍了实例讲解java定时任务,感兴趣的的朋友可以参考下
    2015-08-08
  • Java 中很好用的数据结构(你绝对没用过)

    Java 中很好用的数据结构(你绝对没用过)

    今天跟大家介绍的就是 java.util.EnumMap,也是 java.util 包下面的一个集合类,同样的也有对应的的 java.util.EnumSet,对java数据结构相关知识感兴趣的朋友一起看看吧
    2022-05-05
  • SpringBoot数据访问的实现

    SpringBoot数据访问的实现

    本文主要介绍了SpringBoot数据访问的实现,引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作,感兴趣的可以了解一下
    2023-11-11
  • java实现新浪微博Oauth接口发送图片和文字的方法

    java实现新浪微博Oauth接口发送图片和文字的方法

    这篇文章主要介绍了java实现新浪微博Oauth接口发送图片和文字的方法,涉及java调用新浪微博Oauth接口的使用技巧,具有一定参考接借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 一文彻底弄懂spring boot自动配置的过程(推荐)

    一文彻底弄懂spring boot自动配置的过程(推荐)

    SpringBoot的自动配置机制通过@SpringBootApplication注解作为起点,结合@EnableAutoConfiguration和spring.factories文件,实现了基于类路径依赖、环境配置和自定义代码的智能化配置,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • Spring MVC利用Swagger2如何构建动态RESTful API详解

    Spring MVC利用Swagger2如何构建动态RESTful API详解

    这篇文章主要给大家介绍了关于在Spring MVC中利用Swagger2如何构建动态RESTful API的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-10-10
  • Springboot 整合 Java DL4J 实现医学影像诊断功能介绍

    Springboot 整合 Java DL4J 实现医学影像诊断功能介绍

    本文介绍如何利用SpringBoot整合Java Deeplearning4j实现医学影像诊断功能,重点介绍了卷积神经网络在处理医学影像中的应用,以及如何进行数据预处理、模型构建、训练与预测,提供了详细的代码实现和单元测试方法,目的是辅助医生更准确快速地进行疾病诊断
    2024-10-10
  • Java面向对象编程之类的继承详解

    Java面向对象编程之类的继承详解

    这篇文章主要介绍了Java面向对象编程之类的继承,结合实例形式较为详细的分析了Java面向对象编程类的概念、功能、使用方法及相关注意事项,需要的朋友可以参考下
    2018-02-02

最新评论