有C编程经验的同学应该对头文件都很熟悉,Java中的package也起到了类似的功能。当系统被拆分为多个微服务时,我们需要将各服务共用的class,和interface抽出来组成一个jar包,这样既简化了微服务系统的开发,又有利于系统的扩展。
本文使用User微服务来进行示例说明,文中所使用的java版本为1.8.0_40,gradle版本为2.10。
1.创建api.jar
api.jar即系统各微服务共用的jar包。
首先创建一个基于gradle的java工程,具体方法见《springboot+gradle 构建多模块项目》。
创建好的项目结构如下:
接下来修改根目录下的build.gradle,
buildscript {
repositories {
mavenLocal()
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/milestone" }
jcenter()
}
dependencies {
classpath('com.github.jengelman.gradle.plugins:shadow:1.2.4')
}
}
apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'com.github.johnrengelman.shadow'
group = 'com.formularoom'
archivesBaseName = 'api'
version = '1.0.0'
jar {
baseName = archivesBaseName
}
shadowJar {
baseName = archivesBaseName
classifier = null
version = version
}
// JVM 版本号要求
sourceCompatibility = 1.8
targetCompatibility = 1.8
// java编译的时候缺省状态下会因为中文字符而失败
[compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8'
ext {
lombokVer = '1.16.8'
libPath = "file:" + new File(rootProject.rootDir, '../Libs').getAbsolutePath().toString()
}
repositories {
mavenLocal()
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
maven { url "http://nexus.mvnsearch.org/content/repositories/releases/" }
maven { url "http://nexus.mvnsearch.org/content/repositories/snapshots/" }
mavenCentral()
jcenter()
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/milestone" }
maven { url 'http://maven.springframework.org/release' }
maven { url 'http://maven.springframework.org/milestone' }
}
dependencies {
compile(
"org.projectlombok:lombok:$lombokVer"
)
testCompile(
)
}
jar {
manifest {
attributes("Implementation-Title": "Gradle")
}
}
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
uploadShadow {
repositories.mavenDeployer {
repository(url: libPath)
}
}
以上配置中,第一个需要注意的是,引入了maven plugin,它可以给api.jar添加group和version信息,并按照中央仓库中对jar包的要求,给api.jar添加上描述信息,便于其他微服务引用。另外maven plugin提供了将jar包上传到中央仓库的task,通过它,我们可以将api.jar上传到指定的目录,如上述配置中的libPath ,就是作为中央仓库使用的目录,它与其他服务的目录关系如下图所示。
第二个需要注意的是,引入了shadow plugin,它主要是将jar包的依赖一起打包,生成一个uber-jar。uploadShadow是此plugin提供的方法,用来将jar提交到中央仓库。
2.添加user service的信息到api.jar
添加User.java,示例代码如下:
package com.formularoom.user;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@NoArgsConstructor
@Data
public class User implements Serializable {
private long id;
private String userName;
private String email;
private String password;
private long created_at;
private long updated_at;
}
@NoArgsConstructor和@Data是lombok提供的注解,可以帮我们生成get/set函数。
添加UserService.java
package com.formularoom.user;
import java.util.List;
public interface UserService {
long count();
String createUser(User user);
String editUser(User user);
String deleteUser(long userId);
String resetPassword(long userId, String password);
List<Long> getUserIdLst();
List<User> getUserLst();
User getUserById(long id);
}
添加完代码后,可使用intelliJ idea中所提供的gradle panel完成编译,打包,提交的动作,如下图所示,
上传完成后,Libs目录的结构如下:
至此,api.jar已完成,至于再其他项目中如何使用,会在下一篇博客中进行示例讲解。
完整的示例代码,可从此处 获取。
交流群号,255489119。