分类目录归档:Java

SpringBoot 非 Web 项目运行

有时候一些项目并不需要提供 Web 服务,例如跑定时任务的项目,如果都按照 Web 项目启动未免画蛇添足浪费资源

为了达到非 Web 运行的效果,首先调整 Maven 依赖,不再依赖 spring-boot-starter-web,转而依赖最基础的 spring-boot-starter:

此时按照原先的方式启动 SpringBootApplication 会发现启动加载完之后会立即退出,这时需要做点工作让主线程阻塞让程序不退出:

这里利用了 SpringBoot 提供的 CommandLineRunner 特性,这个名字比较有欺骗性,实际效果如下:

SpringBoot 应用程序在启动后,会遍历 CommandLineRunner 接口的实例并运行它们的 run 方法。也可以利用 @Order 注解(或者实现Order接口)来规定所有 CommandLineRunner 实例的运行顺序

OkHttp 和 AsyncHttpClient 性能对比

OkHttp: http://square.github.io/okhttp/
AsyncHttpClient: https://github.com/AsyncHttpClient/async-http-client

测试代码:

测试结果:

OkHttp Sync took: 13018 ms
OkHttp Async took: 3185 ms
AsyncHttpClient took: 4980 ms

Spring MVC 异常响应编码设置

直接代码说话

Apache CXF 客户端开发

通过 WSDL 生成 Java 代码

在 IDEA 配置 CXF Engine 时各种不让我选择目录,不知道什么原因,因此通过命令行来生成:

  • apache-cxf-home: CXF 目录
  • output-dir: 生成的代码输出目录
  • package-name: 生成的 Java 代码的包路径
  • wsdl-url: 远端的调用地址( ?wsdl )

添加 Maven 依赖

Java Config 方式与 Spring 整合

网上包括官方文档都比较老,单独写个实例:

Maven Tips

Nexus

使用本地代理仓库

Nexus配置好后会默认有一个Maven Central仓库的Proxy,将自己的项目配置成使用代理

将插件仓库也配置成使用本地代理

调整Nexus缓存时间

由于国内访问Maven仓库很卡,容易发生网络故障导致Nexus缓存了未找到记录,可在Nexus后台将对应仓库的Not Found Cache TTL改成一个较短的值(例如5分钟)

为不同的开发环境创建不同的仓库

通常一个项目在不同的环境下存在不同的版本,本文创建dev、qa、production三个仓库并演示如何通过变量来选择使用哪个仓库

使用变量

使用不同的profile定制变量

以下配置声明了dev、qa、production三个profile,并分别定义了branch和skipTest两个变量,且将dev置为默认激活的profile:

命令行可通过-P参数来指定使用不同的profile,例如:

通过变量声明仓库

在Central仓库基础上加入

禁用仓库中Snapshot版本的唯一版本号

发布

配置deploy仓库

以配置snapshotRepository为例:

配置deploy账号

编辑文件:

文件内容如下:

常规发布

通过前两处配置,已经可以正常发布:

跳过发布

通常对于J2EE的WAR项目,只需要编译打包,而不需要将WAR文件发布到仓库中,通过配置maven-deploy-plugin跳过发布环节:

打包额外的jar

通过maven-jar-plugin可以在项目中打包出更多的自定义jar包:

可通过配置多个execution并为其指定不同的id来打出更多的jar

注意:此方式打出的jar不会在deploy时发布到仓库中,而通过classfier方式打出的jar会发布,请注意此区别

以上两种方式在编译期都可以做到在target目录输出jar包的效果

发布额外打包的jar并指定自定义POM

以下配置将当前构建跳过发布,并打包额外的jar,然后为这个jar指定自定义的POM信息后上传至指定仓库:

包含空目录

Maven构建时会自动忽略空目录,以下插件配置可将空目录保留: