Можно ли получить классы из корневого модуля в gradle?

#java #spring-boot #gradle

#java #весенняя загрузка #gradle

Вопрос:

У меня есть многомодульный проект spring boot. Корневой проект — это «Книжный магазин», а дочерний модуль — «api». Я пытаюсь использовать в «api» классы из «книжного магазина». Но у меня ошибка:

Возникла проблема при оценке проекта ‘: api’. Проект с путем ‘:BookStore’ не удалось найти в project ‘:api’.

Мои корневые настройки.gradle:

 pluginManagement {
    plugins {
        id 'org.springframework.boot' version "2.3.3.RELEASE"
        id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    }
}
rootProject.name = 'BookStore'

include 'api'
 

build.gradle корня:

 plugins {
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
    id 'java'
    id 'idea'
}

allprojects {
    group = 'com.aleksandr'
    version = '1.0-SNAPSHOT'
    description = 'BookStore'

}
subprojects {
    repositories {
        mavenCentral()
    }

    apply {
        plugin("io.spring.dependency-management")
    }
}
java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    mavenLocal()
    maven {
        url = uri('https://repo.maven.apache.org/maven2/')
    }
}


dependencies {

    implementation project(':api')
}
 

И build.gradle дочернего модуля:

 plugins {
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
    id 'java'
    id 'idea'
}

repositories {
    mavenCentral()
    maven {
        url = uri('https://repo.maven.apache.org/maven2/')
    }
}
dependencies {
    compile project(":BookStore")
    implementation 'org.springframework.boot:spring-boot-starter-web'
}
 

Что я делаю не так? Как я могу получить классы из корневого модуля?

Ответ №1:

Если вам нужно создать зависимость от подпроекта (здесь , api ) к RootProject, вы должны использовать одну из следующих обозначений зависимостей:

дочерний модуль build.gradle

 dependencies {
    api(project(":"))  // ":" is the identifier for the rootProject
    
    // OR 
    
    api(rootProject)   // "rootProject" varible points to the root Project instance.
    
}
 

Но в вашем примере есть еще одна проблема: вы создаете цикл зависимостей между RootProject и api subproject, что недопустимо.

IMO, ваш api подпроект не должен зависеть от корневого проекта.

Комментарии:

1. Итак, есть ли проблема с архитектурой?

2. да, похоже на то. Я предполагаю, что ваш корневой проект, «BookStore», является основным проектом приложения, содержащим класс точки входа @SpringBootApplication; этот проект «потребляет» подпроекты, например api . но почему он должен api зависеть от этого основного проекта приложения?? я думаю, здесь что-то не так