目录
4.2. library子工程的build.gradle的配置
4.3. Application子工程的build.gradle的配置
前言
使用idea创建一个gradle父子工程,父工程里包含两个子工程。一个是经常被用作其他工程依赖的jar, 名为library;另一个是自己部署的业务逻辑代码应用,名为application.
工具 | 版本 |
Idea | 2019.3.3 |
gradle | 5.2.1 |
第一步:创建父工程
选择Gradle,以及对应的jdk版本。
下一步:配置父工程的名称、保存地址、组、工程标识、工程版本,如下图。
工程文件介绍:
Demo——工程名称 .gradle——idea导入gradle工程, 自动编译生成的gradle文件,不用关心。 ... .idea——idea导入工程, 自动编译生成的idea文件,不用关心。 ... build.gradle——gradle的构建文件,里面就如maven的pom.xml文件,非常重要的文件。 gradle——idea编译gradle工程时,用得到的gradle插件jar,不用关心。 wrapper gradle-wrapper.jar gradle-warrper.properties gradlew——在linux系统上可以运行构建gradle工程的脚本,不用关心。 gradlew.bat——在window系统上可以运行构建gradle工程的脚本,不用关心。 settings.gradle——针对module的全局配置,该工程所有子module都是通过settings.gradle来配置。 src——源码文件包 main——上线部署的源码包 Test——单元测试的源码包 External Libraries——该工程依赖的所有外部jar展示 ... |
工程中不用关心的脚本文件(gradlew和gradlew.bat)删除掉, 因为我们是使用java -jar启动工程。还有父工程src文件夹也要删掉,我们源代码是放在子模块中开发的。精简后的目录如下。
第二步:创建子模块——library
在idea的project的table中,选中父工程名,new->module。
下一步:跟创建父工程一样,仍然选中Gradle创建模块.
下一步:配置子模块工程的名称、保存路径、组名、唯一标识、版本。然后finish.
下一步:创建子模块后,idea会对父工程重新构建,父工程会多出个src文件夹,删掉不用。但父工程的settings.gradle新增了一个子模块的配置, 子模块因为不需要单元测试,所以删除test包目录,main包里的resources也不需要,删掉。
删除无需关心的文件夹后的目录结构如图:
第三步:创建子模块——application
第一步:跟创建父工程一样,仍然选中Gradle创建模块,创建子模块application。
下一步:新建了第二个子模块后,父工程和所有子工程都会被重新重新编译导入idea。也会重新生成一些文件,我们仍然删除掉我们不需要的文件。
新加一个.gitingore文件(小技巧:.gitingore可以通过选择spring initialzr工程并指定gradle工程生成获得)。最后的工程结构如图:
第四步:配置父子工程的build.gradle文件
4.1. demo父工程build.gradle的配置
buildscript {
ext {
mavenPublicUrl = 'http://nexus.xxx.com/repository/maven-public/'
//私服快照地址
mavenSnapshotUrl = 'http://nexus.xxx.com/repository/xxx-snapshot/'
//私服正式地址
mavenReleaseUrl = 'http://nexus.xxx.com/repository/xxx-releases/'
mavenPublishUsername = 'admin'
mavenPublishPassward = 'xxxxxx'
lombokVersion = '1.18.8'
}
}
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
// 所有子项目的通用配置
allprojects{
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven-publish'
//指定jdk版本
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
// 阿里云的仓库
// maven{ url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven {url "${mavenPublicUrl}" }
maven {url "${mavenSnapshotUrl}" }
maven {url "${mavenReleaseUrl}" }
mavenCentral()
}
dependencies {
//lombok
compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
testCompileOnly "org.projectlombok:lombok:${lombokVersion}"
testAnnotationProcessor "org.projectlombok:lombok:${lombokVersion}"
}
}
4.2. library子工程的build.gradle的配置
group 'org.example'
version '1.1.RELEASE'
//maven-publish是打包并发布jar上传至私服的插件
apply plugin: 'maven-publish'
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//指定上传的注释,包含标注date和email
javadoc {
options.encoding = 'UTF-8'
options.tags = ["date", "email"]
}
//上传source
task sourcesJar(type: Jar) {
from sourceSets.main.allJava
archiveClassifier = 'sources'
}
//上传java注释
task javadocJar(type: Jar) {
from javadoc
archiveClassifier = 'javadoc'
}
//发布jar到私服
publishing {
publications {
maven(MavenPublication) {
artifactId "demo-library"
from components.java
artifact sourcesJar
artifact javadocJar
}
}
repositories {
maven {
name 'myDemo'
//指定要上传的maven私服仓库
url = version.endsWith('SNAPSHOT') ? "${mavenSnapshotUrl}" : "${mavenReleaseUrl}"
//认证用户和密码
credentials {
username "${mavenPublishUsername}"
password "${mavenPublishPassward}"
}
}
}
}
library打包上传私服请选择name对应的发布上传命令,如下图:
4.3. Application子工程的build.gradle的配置
buildscript{
repositories {
// 阿里云的仓库
// maven{ url 'http://maven.aliyun.com/nexus/content/groups/public' }
maven {url "${mavenPublicUrl}" }
maven {url "${mavenSkioSnapshotUrl}" }
maven {url "${mavenSkioReleaseUrl}" }
mavenCentral()
}
dependencies {
//该插件定义了的spring-boot和dependency-management的引入版本
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group 'org.example'
version '1.0-SNAPSHOT'
dependencyManagement {
imports {
//指定依赖的spring-cloud版本
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
compile project(":library")
compile('org.springframework.boot:spring-boot-starter-web')
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
第五步:单元测试验证
5.1. Application项目结构
5.2. DemoApplication入口代码
package com.jiangbo.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* com.jianbo.demo.DemoApplication
*
* @author chengjiangbo@shandiantech.com
* @version 1.0.0
* @date 2021/08/16
*/
@EnableEurekaClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
5.3. UserService的简单方法
package com.jiangbo.demo.sevice;
import dto.UserDTO;
import org.springframework.stereotype.Service;
/**
* UserService
*
* @author chengjiangbo@shandiantech.com
* @version 1.0.0
* @date 2021/08/16
*/
@Service
public class UserService {
public UserDTO getById(Long userId){
UserDTO userDTO = new UserDTO();
userDTO.setId(userId);
userDTO.setName("张三");
userDTO.setAge(20);
return userDTO;
}
}
5.4. 单元测试代码
package com.jiangbo.demo;
import com.jiangbo.demo.sevice.UserService;
import com.netflix.discovery.converters.Auto;
import dto.UserDTO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
UserDTO userDTO = userService.getById((long) 1);
Assert.notNull(userDTO, "userDTO不能为空");
}
}
参考资料
- https://blog.youkuaiyun.com/gavinchen1985/article/details/81673132
- https://docs.spring.io/spring-boot/docs/2.5.3/gradle-plugin/reference/htmlsingle/
- 深入了解gradle和maven的区别