先来看一段每一个项目都要写的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. 【2017-05-18】WebForm的Repeater控件和一些简单控件

    一.Repeater控件 1. <%@ %> - 这里面写一些声明和引用的 <%  %> - 编写C#代码的 <%= %> - 往界面上输出一个变量的值 <% ...

  2. GO的初始简书(一)简介安装

    已经玩了很长一段时间的golang了,做个gopher,下面我将逐步展示各种go语言的开发,从入门开始哦,完全是凭着自己学习和实践的结果展示,如果有说的不对的,请指正. 简介 go语言是由Google ...

  3. Samba文件共享服务

    Samba起源: 早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序:NFS ...

  4. 为什么重写equals时必须重写hashCode方法?(转发+整理)

    为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...

  5. spring-线程池(3)

    一.初始化 1,直接调用 import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; import org.springframe ...

  6. spring-线程池(1)

    多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了.spring封装了java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说 ...

  7. jmeter跨线程组传值

    在测试过程中,有时候需要jmeter跨线程组传值,jmeter本身又不具备此功能,那么,又该如何实现呢? 其实,我们可以通过BeanShell去实现. 实现过程如下: 1.线程组A中,使用正则表达式提 ...

  8. Handling Class Imbalance with R and Caret - An Introduction

    When faced with classification tasks in the real world, it can be challenging to deal with an outcom ...

  9. Asynchronous and Distributed Programming in R with the Future Package

    Every now and again someone comes along and writes an R package that I consider to be a 'game change ...

  10. 你知道“移动端车牌识别”可以嵌入到PDA中应用吗?

    一.移动端车牌识别产品描述 移动端车牌识别软件是基于移动平台的OCR识别应用程序,支持Android/IOS等多种主流移动操作系统.该产品只需通过智能手机或Pad的摄像头对准车牌,无需拍照,实现自动采 ...