目录

前言

第一步:创建父工程

第二步:创建子模块——library

第三步:创建子模块——application

第四步:配置父子工程的build.gradle文件 

4.1. demo父工程build.gradle的配置

4.2. library子工程的build.gradle的配置

4.3. Application子工程的build.gradle的配置

第五步:单元测试验证

5.1. Application项目结构

5.2. DemoApplication入口代码

5.3. UserService的简单方法

5.4. 单元测试代码

参考资料


前言

使用idea创建一个gradle父子工程,父工程里包含两个子工程。一个是经常被用作其他工程依赖的jar, 名为library;另一个是自己部署的业务逻辑代码应用,名为application.

工具

版本

Idea

2019.3.3

gradle

5.2.1

第一步:创建父工程

选择Gradle,以及对应的jdk版本。

idea gradle distributionUrl 国内镜像 idea build.gradle_gradle

下一步:配置父工程的名称、保存地址、组、工程标识、工程版本,如下图。

idea gradle distributionUrl 国内镜像 idea build.gradle_maven_02

 工程文件介绍:

idea gradle distributionUrl 国内镜像 idea build.gradle_gradle_03

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文件夹也要删掉,我们源代码是放在子模块中开发的。精简后的目录如下。

 

idea gradle distributionUrl 国内镜像 idea build.gradle_maven_04

第二步:创建子模块——library

在idea的project的table中,选中父工程名,new->module。

idea gradle distributionUrl 国内镜像 idea build.gradle_intellij idea_05

下一步:跟创建父工程一样,仍然选中Gradle创建模块.

下一步:配置子模块工程的名称、保存路径、组名、唯一标识、版本。然后finish.

idea gradle distributionUrl 国内镜像 idea build.gradle_ide_06

 下一步:创建子模块后,idea会对父工程重新构建,父工程会多出个src文件夹,删掉不用。但父工程的settings.gradle新增了一个子模块的配置, 子模块因为不需要单元测试,所以删除test包目录,main包里的resources也不需要,删掉。

idea gradle distributionUrl 国内镜像 idea build.gradle_gradle_07

删除无需关心的文件夹后的目录结构如图:

idea gradle distributionUrl 国内镜像 idea build.gradle_maven_08

第三步:创建子模块——application

第一步:跟创建父工程一样,仍然选中Gradle创建模块,创建子模块application。

idea gradle distributionUrl 国内镜像 idea build.gradle_gradle_09

下一步:新建了第二个子模块后,父工程和所有子工程都会被重新重新编译导入idea。也会重新生成一些文件,我们仍然删除掉我们不需要的文件。

idea gradle distributionUrl 国内镜像 idea build.gradle_maven_10

新加一个.gitingore文件(小技巧:.gitingore可以通过选择spring initialzr工程并指定gradle工程生成获得)。最后的工程结构如图:

idea gradle distributionUrl 国内镜像 idea build.gradle_gradle_11

第四步:配置父子工程的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对应的发布上传命令,如下图:

idea gradle distributionUrl 国内镜像 idea build.gradle_intellij idea_12

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项目结构

idea gradle distributionUrl 国内镜像 idea build.gradle_ide_13

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不能为空");
    }

}