Зависимости Gradle «Реализация» ограничиваются средой выполнения, когда у проекта нет собственных классов - PullRequest
0 голосов
/ 04 июня 2019

У меня есть многопроектная сборка Gradle для собственного Spring Boot Starter.В соответствии с соглашением Spring Boot Starter все мои классы находятся в проекте «автоконфигурации», и у меня есть отдельный «стартовый» проект, который ТОЛЬКО вводит зависимости, необходимые для использования автоконфигурации.

В результате многопроектной сборки2 неиспользуемых фляги, 1 для подпроекта автоконфигурации и один для подпроекта стартера.Мой новый проект, использующий этот стартер, тянет за собой стартовый сосуд, но когда я использую классы из переходных зависимостей, мой проект не может найти их где-либо на пути к классам.

Когда я копался вЯ обнаружил, что все зависимости, которые он определяет, имеют объем RUNTIME, что объясняет проблему.Я могу «исправить» проблему, установив все зависимости в моем начальном модуле как «compile» вместо «реализовать», но я понимаю, что «compile» находится на выходе, и что зависимости «реализации» должны быть в области компиляциитем не мение.Может кто-нибудь сказать мне, какой дополнительный конфиг может потребоваться для определения зависимостей стартера как «реализации» без их определения в качестве «среды выполнения» в получающемся jar-файле?

Мой многопроектный стартер / автоконфигурация root файл Gradle:

plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE' apply false
    id 'io.spring.dependency-management' version '1.0.7.RELEASE' apply false
}

wrapper {
    gradleVersion = '5.2.1'
}

repositories {
    mavenLocal()
    // private repo info omitted
    mavenCentral()
    jcenter()
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'maven-publish'
    apply plugin: 'java-library'

    group = 'com.mystarter'

    repositories {
        mavenLocal()
        // private repo info omitted
        mavenCentral()
        jcenter()
    }

    dependencies {
        annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor"
        annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
    }

    bootJar {
        enabled = false
    }

    jar {
        enabled = true
    }

    javadoc {
        failOnError = false
        options.addStringOption('Xdoclint:none', '-quiet')
    }

    task sourcesJar(type: Jar) {
        from sourceSets.main.allJava
        classifier = 'sources'
    }
    task javadocJar(type: Jar) {
        from javadoc
        classifier = 'javadoc'
    }

    publishing {
        publications {
            myProjStarterArtifacts(MavenPublication) {
                from components.java
                artifact sourcesJar
                artifact javadocJar
            }
        }
        repositories {
            // private repo info omitted
        }
    }

    tasks.build.finalizedBy tasks.publishToMavenLocal
}

Мой начальный подпроект файл сборки:

dependencies {
    compile project(':myproj-spring-boot-autoconfig')

    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.security:spring-security-cas'
    implementation 'org.springframework.security:spring-security-ldap'
}

Если я изменю вышеприведенные строки 'реализации' на 'compile'Строки, вот когда результирующий pom-файл перестает делать эти 4 зависимости "областью выполнения" и вместо этого корректно определяет их как "compile".В качестве примечания отметим, что строка 'compile project' работает просто отлично, это просто строки, являющиеся реализацией, которые, кажется, не работают так, как я ожидал, когда у проекта нет собственных классов.

Зависимость моего нового проекта для моего стартера:

dependencies {
    implementation('com.myproj:myproj-spring-boot-starter:1.0.0')
    // other dependencies
}

1 Ответ

1 голос
/ 13 июня 2019

implementation зависимости, определенные в проекте Gradle, делаются транзитивными только для runtimeClasspath потребителей указанного проекта, то есть по проекту.

Если у вас есть проект без кода, но только с определением зависимостей, рассмотрите возможность использования для него плагина java-platform, который позволяет указывать ограничения и, необязательно, зависимости.

В противном случае, если вы хотите, чтобы проект предоставлял свои зависимости потребителям во время компиляции, вы должны использовать конфигурацию api для их объявления вместо compile, который действительно находится на выходе.

Подробнее см. документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...