Gradle子项目依赖项不起作用,但相同的依赖项在主gradle中可以正常工作

时间:2019-05-08 19:37:25

标签: java spring spring-boot gradle

我一直在为spring boot devtools开发多模块gradle项目。这是github仓库-GitHub Repo

-spring-boot-dev-tools
-src/main
    -java/com/jhooq/springboot/devtools
    -resources
    -spring-boot-dev-tools.gradle ====- subproject gradle 
-.gitignore
-build.gradle ====- main gradle
-gradlew
-gradlew.bat
-settings.gradle

我的build.gradle(主gradle)看起来像:-

            buildscript {
            ext {
                    springBootVersion = '2.1.2.RELEASE'
                }
                repositories {
                    mavenCentral()
                }
                dependencies {
                    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
                }
                        }
            allprojects {
                group 'com.jhooq'
                version '1.0-SNAPSHOT'
            }
            subprojects{
                repositories {
                    mavenCentral()
                }
                apply plugin: 'java'
                apply plugin: 'idea'
                apply plugin: 'org.springframework.boot'
                apply plugin: 'io.spring.dependency-management'

                sourceCompatibility = 1.8
                targetCompatibility = 1.8

                dependencies {
                    compile ("org.springframework.boot:spring-boot-starter")
                    compile ("org.springframework.boot:spring-boot-starter-test")
                }
            }
            project(':spring-boot-dev-tools'){

                configurations {
                    developmentOnly
                    runtimeClasspath {
                        extendsFrom developmentOnly
                    }
                }

                dependencies {
                    compile project(':spring-boot-app')
                    compile ("org.springframework.boot:spring-boot-starter-web")
                    developmentOnly("org.springframework.boot:spring-boot-devtools")
                }

            }

因此,如您所见,我是否将compile ("org.springframework.boot:spring-boot-starter-web")放在project(':spring-boot-dev-tools')中,所以我的spring boot应用程序在端口8000上启动并保持运行

但是当我在spring-boot-dev-tools.gradle中跟随gradle脚本移动时,我遇到了问题,然后我的Spring Boot应用程序像正常的Spring Boot应用程序一样启动和关闭。

project(':spring-boot-dev-tools'){

                configurations {
                    developmentOnly
                    runtimeClasspath {
                        extendsFrom developmentOnly
                    }
                }

                dependencies {
                    compile project(':spring-boot-app')
                    compile ("org.springframework.boot:spring-boot-starter-web")
                    developmentOnly("org.springframework.boot:spring-boot-devtools")
                }

因此,如果我在子模块中移动弹簧spring-boot-starter-webspring-boot-devtools依赖项时总结了我的问题,则弹簧启动无法在port:8000上运行/运行,而是像正常的弹簧一样启动和关闭启动应用程序。

2 个答案:

答案 0 :(得分:0)

您是否有理由在每个单独的Java包中定义主类?

我最近制作了一个模块化的整体示例,该示例可能会对您有所帮助: ECMAScript® 2016 Language Specification

还有一些要考虑的技巧:

  • 定义通用的gradle配置,而不是“ allprojects”和“ subprojects”关键字。两者之间的差异归结为modular monolith example

  • 使用关键字实现代替编译。这样,您的依赖项就不会再泄漏到使用者的编译类路径中了。否则,使用关键字 api

答案 1 :(得分:0)

我设法使其正常运行,但解决方案显然对我来说并不好。但是无论如何,这就是我所做的-

  1. 我将子项目/模块依赖项移至其自己的gradle文件,并将其从build.gradle(主项目gradle)中删除了
  2. 我改用“实现”代替了“编译项目”

            configurations {
                developmentOnly
                runtimeClasspath {
                    extendsFrom developmentOnly
                }
            }
    
            dependencies {
                implementation {
                    'org.springframework.boot:spring-boot-devtools'
                    ':spring-boot-app'
                    'org.springframework.boot:spring-boot-starter-web'
    
                }
            }