先来看一段每一个项目都要写的BASH脚本。

 #!/usr/bin/env bash

  in
 start )
     ;;
     stop )
     ;;

 restart )
     shift
     "$0" stop ${@}

     "$0" start ${@}
     ;;

 *)

     ;;
 esac

相信大家都不会陌生,每次都重复不免有些难受。抽了点时间做了个简单的实现 https://github.com/geeker-house/jbootstrap

实现的方式比较简单,定义了一个接口用来处理command line arguments传递以及jvm shutdown hook调用, 用serviceloader去加载需要启动的项目。接口和实现如下:

 package org.geekerhouse.jbootstrap.api;

 /**
  * @author SY0503
  */
 public interface Launcher {

     /**
      * command line arguments
      * @param args
      */
     void launch(String[] args);

     /**
      * jvm shutdown hook
      */
     void destroy();
 }
 package org.geekerhouse.jbootstrap.main;

 import org.geekerhouse.jbootstrap.api.Launcher;

 import java.util.ServiceLoader;

 /**
  * @author SY0503
  */
 final class Main {

     private final static class Bootstrap implements Launcher {

         private final ServiceLoader<Launcher> loader;
         private static volatile boolean running = true;

         private Bootstrap() {
             this.loader = ServiceLoader.load(Launcher.class);
         }

         @Override
         public void launch(String[] args) {
             for (Launcher launcher : loader) {
                 launcher.launch(args);
             }

             synchronized (Bootstrap.class) {
                 while (running) {
                     try {
                         Bootstrap.class.wait();
                     } catch (Throwable ignored) {
                     }
                 }
             }
         }

         @Override
         public void destroy() {
             for (Launcher launcher : loader) {
                 launcher.destroy();
             }

             synchronized (Bootstrap.class) {
                 running = false;
                 Bootstrap.class.notify();
             }
         }
     }

     public static void main(String[] args) {
         Bootstrap bootstrap = new Bootstrap();
         Runtime.getRuntime().addShutdownHook(new Thread(() -> bootstrap.destroy()));
         bootstrap.launch(args);
     }
 }

那么不同的项目该如何处理jvm配置参数呢? 配合maven assembly plugin和maven profile, 我们可以为不同的项目配置不同的目录。 只需要在maven工程文件中添加如下配置就可以:

 <profiles>
         <profile>
             <id>default</id>
             <properties>
                 <profile.active>default</profile.active>
             </properties>
             <activation>
                 <activeByDefault>true</activeByDefault>
             </activation>
         </profile>
         <profile>
             <id>empty</id>
             <properties>
                 <profile.active>empty</profile.active>
             </properties>
             <activation>
                 <activeByDefault>false</activeByDefault>
             </activation>
         </profile>
         <!-- add profile here -->
     </profiles>

当然,launcher的实现类依赖,可以在profile的depency中给出就好了, 这样在构建的时候就可以依据不同的profile给项目打包了。由于比较简单,可以自行插件代码和脚本。

java-bootstrap的更多相关文章

  1. java +bootstrap table 完整例子

    需求:现在常用的table 插件很多, 比如 jquey datatables ,不过操作挺 麻烦, 看到推荐的bootstrap 自带的 table,就用到项目来,先看效果:

  2. java bootstrap分页

    样式如下 datumMap.total总共多少页 datumMap.page第几页 <nav class="pull-right"> <ul class=&quo ...

  3. 2016年排名Top 100的Java类库——在分析了47,251个依赖之后得出的结论(16年文章)

    本文由HollisChuang 翻译自 The Top 100 Java Libraries in 2016 – After Analyzing 47,251 Dependencies . 原作者:H ...

  4. 2016 年排名 Top 100 的 Java 类库

    我们分析了GitHub中47,251个依赖,从中找出了排名前一百的Java类库,让我们看看谁在前面,谁在后面. 我们在漫长的周末的消遣方式就是浏览GitHub并且搜索流行的Java类库.我们决定把其中 ...

  5. What is Java virtual machine?

    Java Virtual Machine (JVM) is a specification that provides runtime environment in which java  bytec ...

  6. Python on Android

    Python on Android Posted on April 29, 2015 by Alexander Taylor   There are an increasing number of r ...

  7. oracle存储过程代码覆盖率统计工具

    目前针对于高级语言如C++,JAVA,C#等工程都有相关的代码覆盖率统计工具,但是对于oracle存储过程或者数据库sql等方面的项目,代码覆盖率统计和扫描工具相对较少. 因此针对这种情况,设计了代码 ...

  8. Netty框架入门

    一.概述     Netty是由JBOSS提供的一个java开源框架.     Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.   二. ...

  9. JVM源码分析之JVM启动流程

      原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...

  10. [源码阅读] 阿里SOFA服务注册中心MetaServer(1)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(1) 0x00 摘要 0x01 服务注册中心 1.1 服务注册中心简 ...

随机推荐

  1. 学习笔记TF011:多层神经网络

    线性回归.对数几率回归模型,本质上是单个神经元.计算输入特征加权和.偏置视为每个样本输入特征为1权重,计算特征线性组合.激活(传递)函数 计算输出.线性回归,恒等式(值不变).对数几率回归,sigmo ...

  2. MapReduce运行流程分析

    研究MapReduce已经有一段时间了.起初是从分析WordCount程序开始,后来开始阅读Hadoop源码,自认为已经看清MapReduce的运行流程.现在把自己的理解贴出来,与大家分享,欢迎纠错. ...

  3. Linux上open-iscsi 的安装,配置和使用

    关于open-iscsi open-iscsi是一个实现 RFC3720 iSCSI协议的高性能initiator程序.iSCSI使得访问SAN上的存储不再只能依赖Fibre Channel,也可以通 ...

  4. 将数据的初始化放到docker中的整个工作过程(问题记录)

    将数据的初始化放到docker中的整个工作过程 由于是打算作为个人博客,所以对于install这个步骤,我从一开始就打算删掉的,前面一个多星期一直在修bug,到前天才开始做这个事情. 过程中也是碰到了 ...

  5. Linux(Debian、Ubuntu、Deepin等)安装最新版Chrome Unstable

    将下载源加入到系统的源列表 sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ ...

  6. java基础(六章)

    一.for循环的使用场合 l  while循环--先判断,再循环 while(1.条件表达式){      //2.循环操作      //3.更改循环条件表达式 } l  do-while--先循环 ...

  7. 打开IIS的快捷键

    [windows键+R]→在运行界面输入“inetmgr”→点击回车键,即可以出现IIS界面

  8. 最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类

    前言:用于处理Java基本数据的转换及进制转换操作工具 一.实现功能 1.int与byte互转 2.int与byte[]互转 3.short与byte互转 4.short与byte[]互转 5.16位 ...

  9. 为什么使用dojo?dojo与jquery有什么不同?dojo适合什么开发场景?

    首先介绍一下dojo的特性: 1.Dojo是一个符合AMD规范的企业级框架(dojo是一个重量级框架) 2.Dojo全面支持异步加载JS机制(即:支持通过require异步加载JS模块,通过defin ...

  10. Dom 简介

    HTML DOM 简介 DOM 教程 DOM 节点 HTML DOM 定义了访问和操作 HTML 文档的标准. 您应该具备的基础知识 在您继续学习之前,您需要对以下内容拥有基本的了解: HTML CS ...