分类: 默认

  • Windows系统下classpath过长导致的bootRun不能运行

    Spring Boot提供了一个很便利的命令bootRun来快速启动应用,项目中的依赖会在启动时作为classpath的一部分传递给java,但是windows系统下有一个问题,如果classpath很长的时候就会直接报错,无法运行。但是如果你生成jar文件,再运行jar文件本身就不会遇到这个问题。

    bootRun是一个很便利的功能,自然我们不希望这个功能无法使用,有个取巧的办法。

    首先生成一个jar,这个jar文件的manifest中包含了所有依赖,然后bootRun直接依赖这个jar。

    task pathingJar(type: Jar) {
        dependsOn configurations.runtime
        appendix = 'pathing'
     
        doFirst {
            manifest {
                attributes "Class-Path": configurations.runtime.files.collect {
                    it.toURL().toString().replaceFirst(/file:/+/, '/')
                }.join(' ')
            }
        }
    }
     
    bootRun {
        dependsOn pathingJar
        doFirst {
            classpath = files("$buildDir/classes/main", "$buildDir/resources/main", pathingJar.archivePath)
        }
    
  • Docker Toolbox配置镜像

    Docker的镜像拉取有时候会花很长的时间,而国内有很多提供镜像服务的公司,随便找一个即可。

    但是在配置的时候经常会出现无法配置成功的问题,比如DaoCloud会告诉你修改profile文件,要么使用它的主机监控程序。一般情况我只想用镜像加速,并不想主机监控服务,所以选用修改profile文件,但是每次重启之后都没有生效。

    比较了阿里百川还有灵雀云的加速配置文档,基本是一个逻辑,但是依照文档,修改镜像的方法只有两种,第一种是创建的时候直接指定

    docker-machine create ... --engine-registry-mirror=<你的加速地址>

    或者是修改config.json中的RegistryMirror配置

    docker-machine-config-json

    这样在docker-machine重启以后配置才会真正生效。

    参考文档:

    https://github.com/docker/machine/blob/master/docs/reference/create.md…

  • Gulp使用ng-annotate

    Angular中声明注入依赖的方法有三种

    1. 数组注解
    2. $inject属性
    3. 隐式注释

    隐式注释虽然简单,但是在压缩代码的时候会出错,所以一般还是需要选用方法一或者方法二。

    样例如下:

    module.controller('controller', ['$scope', 'greeter', function($scope, greeter) {
      // ...
    }]);
    var controller = function($scope, greeter) {
      // ...
    }
    controller .$inject = ['$scope', 'greeter'];
    module.controller('controller ', controller );

    ng-annotate是专门处理这种情况的插件,因为对于注入的处理毕竟是为了程序运行,而不是开发逻辑需要,这种自动化交给插件比较快。

    安装插件以后只需要加一个@ngInject就行了。

    /* @ngInject */
    function Avengers(storageService, 
  • wiredep自动注入的条件

    Bower解决了前端依赖的获取问题,而Wiredep的初衷是为了解决前端依赖的自动引用问题。

    比如来个简单的例子,以Bootstrap为例,在html中添加

    <html>
    <head>
      <!-- bower:css -->
      <!-- endbower -->
    </head>
    <body>
      <!-- bower:js -->
      <!-- endbower -->
    </body>
    </html>

    那么在安装bootstrap以后我们会发现只有bootstrap.js被正常引用了,但是对应的css并没有。

    这是因为wiredep的工作原理是检查依赖的bower.json文件,并根据其中的main和dependencies来判断需要注入的文件和对应的依赖。而Bootstrap的bower.json文件如下:

    {
      "name": "bootstrap",
      "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
      
  • Gulp inject插件的startTag和endTag

    最近接触了一些前端的东西,在Gulp之下有若干插件,配合起来对于新手而言简直神乎其神,难以理解。

    以gulp-inject为例,只需要在页面中添加

    <!DOCTYPE html>
    <html>
    <head>
      <title>My index</title>
      <!-- inject:css -->
      <!-- endinject -->
    </head>
    <body>
    
      <!-- inject:js -->
      <!-- endinject -->
    </body>
    </html>

    然后配合配置

    var gulp = require('gulp');
    var inject = require('gulp-inject');
    
    gulp.task('index', function () {
      var target = 
  • Gulp获取Jenkins Build Number

    Spring Boot配合nebula插件可以很轻易获取Jenkins的相关信息并暴露出来。

    如果一个纯前端的项目,那么相关信息就需要在自己收集以后在build的时候写入一个地方,比如将buildNumber写入info.json中。

    var file = require('gulp-file');
    var path = require('path');
    gulp.task('generateInfo', function() {
      var buildNumber = process.env.BUILD_NUMBER || 'local';
      var info = {
        build: buildNumber
      };
      return file('info.json', JSON.stringify(info), [src: true])
        .pipe(gulp.dest(path.join(conf.path.dist,'/')));
    });

    这样项目在jenkin上构建的时候就会生成info.json文件。…

  • 领教了百度全家桶的牛逼之处了

    之前一直听说百度全家桶多么牛逼,一直没有放在心上。今天算是领教了,真是厉害。

    下午的时候正在打战争雷霆,之前一直是直连的,但是不知道为什么,速度很慢,ping很大,就寻思着找个游戏加速器。然后看看百度有加速器,就下来试试,结果它包含在一个叫百度桌面的东西里面,想想也没多大事情,安装来试试。

    结果试了一下加速器完全没用,加速以后连登录都不行,准备卸载,卸载也很顺利,没有什么问题,把所有有关百度的都卸载了。

    然后,然后

    然后问题就来了,上不起网了。。。

    重启再试,开机以后进入桌面,起码20个程序弹出报错框,用360修复了LSP,可以上网了。但是输入法不见了!没有切换输入法,也看不见图标,有一个占位符在那里,但是点不动。

    好吧,再重启,依然无效。

    最后在网上研究了很久,居然都不行,输入法就不见了。。。

    只能说百度的工程师真厉害,专心做黑产多好。…

  • Spring Boot在Docker中集成oneapm

    Oneapm是一个不错的监控平台,提供很多监控,从系统层面到具体的应用层面。

    Oneapm有Spring Boot application的支持,今天试着集成了一下。

    因为应用是在Docker中的,所以具体的集成需要修改Dockerfile。首先是配置自己的oneapm.properties文件。然后将文件放在项目中。

    修改Dockerfile,先下载oneapm.zip(下载地址登录oneapm后台可以看到)。然后将自己项目中准备的配置文件覆盖掉默认的,然后在启动参数中添加,具体配置如下

    RUN wget https://user.oneapm.com/account/{你自己的地址}/agent/java/OneAPM_java_Agent_latest.zip
    RUN apk add --no-cache unzip
    RUN unzip OneAPM_java_Agent_latest.zip -d /
    ADD ./.build/oneapm.properties /OneAPM/
    
    ENTRYPOINT ["java,"-javaagent:/OneAPM/oneapm.jar","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=8080","-jar","/app.jar"]

    重新部署以后更新应用,很快就可以看到数据

    oneapm

  • Spring Boot的Banner

    Spring Boot应用在启动的时候会输出一个Banner,同时还会输出使用的Spring Boot的版本。

    默认的Banner如下

    spring-default-banner

    如果你需要自己替换的话可以放置一个banner.txt文件,这样Spring Boot就会使用自定义的banner,而不是默认的banner。

    Spring Banner的选择逻辑

    Banner的优先级和具体逻辑在SpringApplication中。

    	private Banner selectBanner(Environment environment) {
    		String location = environment.getProperty(BANNER_LOCATION_PROPERTY,
    				BANNER_LOCATION_PROPERTY_VALUE);
    		ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader
    				: new DefaultResourceLoader(getClassLoader());
    		Resource resource = resourceLoader.getResource(location);
    		if (resource.exists()) {
    			return new ResourceBanner(resource);
    		
  • Http2在JVM环境的支持

    先来看看容器

    • Undertow
    • Jetty
    • Tomcat9

    然后还有 Netty。

    对于TLS的支持

    • Java6只支持v1
    • Java7支持v1.2
    • Java8支持v1.2
    • Java9支持ALPN