先来看一段每一个项目都要写的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. 配置网络yum源

    有的时候服务器需要下载一些软件,是本地yum源没有的,这时候需要配置网络yum源 #cd  /etc/yum.repos.d/ 把这个目录下的配置文件备份,改名:或者是把文件里边的enabled=1的 ...

  2. 2.1 Java程序的构成

    2.1 Java程序的构成 2.1.1逻辑构成 Java源程序逻辑构成分为两大部分:程序头包的引用和类 的定义 1.程序头包的引用 主要是指引用JDK软件包自带的包,也可以是自己定义的类. 引用之后程 ...

  3. 前端魔法堂:屏蔽Backspace导致页面回退

    前言  前几天用户反映在录入资料时一不小心错按Backspace键,就会直接回退到是一个页面,导致之前辛辛苦苦录入的资料全部丢失了.哦?居然还有这种情况.下面我们来一起探讨一下吧! Windows系统 ...

  4. TCP协议随笔

    传输控制协议TCP是面向连接.保证高可靠性(数据无丢失.数据无失序.数据无错误.数据无重复到达)传输层协议.TCP/IP结构对应OSITCP/IP                           ...

  5. HTML5&CSS3读书笔记

    Hi All, 分享一下我学HTML5 摘抄的读书笔记(我用的还是英文,因为一些新的东西还是来自于欧美国家,希望大家习惯于看一些英文材料): 1. Difference between Section ...

  6. IIS的安装与设置(windows版本)

    IIS,全英文名称:Internet Information Services(互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.IIS的功能很多,如编辑 ...

  7. String源码解析(二)

    方法的主要功能看代码注释即可,这里主要看函数实现的方式. 1.getChars(char dst[], int dstBegin) /** * Copy characters from this st ...

  8. VR全景智慧城市,平台属于每个有创业梦想的人

    如果你还在人生十字路口迷茫,如果你还想你的人生有所成就,让你的人生有不一样的精彩,就来全景智慧城市平台共同打造属于自己的不同凡响的精彩人生吧! 抓住这个机遇,你就走在了 VR时代的前沿,时势造就英雄, ...

  9. int 与 int *

    #include <iostream>using namespace std;int QKPass(int* , int , int);  //若声明为 int QKPass(int, i ...

  10. C语言指针声明探秘

    C语言指针声明探秘