idea创建gradle父子项目结合springBoot——详细介绍build.gradle

本文详细指导如何使用IntelliJ IDEA创建一个包含library库和application应用的Gradle父子工程,涉及配置build.gradle文件,单元测试验证等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

第一步:创建父工程

第二步:创建子模块——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版本。

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

 工程文件介绍:

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

}

参考资料

  1. https://blog.youkuaiyun.com/gavinchen1985/article/details/81673132
  2. https://docs.spring.io/spring-boot/docs/2.5.3/gradle-plugin/reference/htmlsingle/
  3. 深入了解gradle和maven的区别
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值