Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gradle's api & compileOnlyApi configurations created by its java-library plugin do not work, and transitive implementation scope dependencies get exposed, when this plugin is used #1799

Closed
AlexanderBartash opened this issue Oct 16, 2024 · 0 comments · Fixed by #1800
Labels

Comments

@AlexanderBartash
Copy link
Contributor

AlexanderBartash commented Oct 16, 2024

What happened?

Gradle's java-library plugin is more suitable for IntelliJ plugin development than regular java. I think it must be supported, since it a basic Gradle feature.
See:

Sub-issue:

  • If you look carefully at the output on the screenshot below, you will see that org.apache.commons:commons-lang3:3.5 was exposed as a transitive dependency though implementation dependency scope, which is not supposed to happen. It is bad.

The setup:

build.gradle.kts

plugins {
    `java-library`
    //id("org.jetbrains.kotlin.jvm") version "2.0.20"
    id("org.jetbrains.intellij.platform") version "2.1.0"
} 

dependencies {
    implementation(project(":subpr"))
}

repositories {
    mavenLocal()
    mavenCentral()
}

settings.gradle.kts

rootProject.name = "123"

pluginManagement {
    repositories {
        mavenLocal()
        mavenCentral()
        gradlePluginPortal()
    }
}

include(":subpr")

subpr/build.gradle.kts

plugins {
    `java-library`
    //id("org.jetbrains.kotlin.jvm") version "2.0.20"
    id("org.jetbrains.intellij.platform.module")
}

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compileOnlyApi("org.jetbrains:annotations:26.0.1")
    implementation("org.apache.commons:commons-lang3:3.5")
}

Expected result:

  • org.jetbrains:annotations:26.0.1 is available to the root project transitively from the sub project.

Actual result result:

  • It is not, while what should not be available (org.apache.commons:commons-lang3:3.5) is there.
    image

If kotlin plugin is added to the sub-project, somehow it starts working, but implementation is still exposed:
image

Relevant log output or stack trace

sasha@sasha-kubuntu:~/sources/test-java-lib $ gradle dependencies --configuration compileClasspath

> Task :dependencies

------------------------------------------------------------
Root project '123'
------------------------------------------------------------

compileClasspath - Compile classpath for source set 'main'.
\--- project :subpr
     \--- org.apache.commons:commons-lang3:3.5

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 409ms
1 actionable task: 1 executed
sasha@sasha-kubuntu:~/sources/test-java-lib $ gradle :subpr:outgoingVariants --all

> Task :subpr:outgoingVariants
--------------------------------------------------
Variant apiElements
--------------------------------------------------
API elements for the 'main' feature.

Capabilities
    - 123:subpr:unspecified (default capability)
Attributes
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.version         = 22
    - org.gradle.libraryelements     = jar
    - org.gradle.usage               = java-api
Artifacts
    - build/libs/subpr-base.jar (artifactType = jar, classifier = base)

Secondary Variants (*)

    --------------------------------------------------
    Secondary Variant classes
    --------------------------------------------------
    Directories containing compiled class files for main.

    Attributes
        - org.gradle.category            = library
        - org.gradle.dependency.bundling = external
        - org.gradle.jvm.version         = 22
        - org.gradle.libraryelements     = classes
        - org.gradle.usage               = java-api
    Artifacts
        - build/classes/java/main (artifactType = java-classes-directory)

--------------------------------------------------
Variant archives
--------------------------------------------------
Configuration for archive artifacts.

Capabilities
    - 123:subpr:unspecified (default capability)
Artifacts
    - build/libs/subpr-base.jar (artifactType = jar, classifier = base)

--------------------------------------------------
Variant default
--------------------------------------------------
Configuration for default artifacts.

Capabilities
    - 123:subpr:unspecified (default capability)
Artifacts
    - build/libs/subpr-base.jar (artifactType = jar, classifier = base)

--------------------------------------------------
Variant intellijPlatformComposedJar (l)
--------------------------------------------------
IntelliJ Platform final composed Jar archive

Capabilities
    - 123:subpr:unspecified (default capability)
Attributes
    - org.gradle.category                = library
    - org.gradle.dependency.bundling     = external
    - org.gradle.jvm.environment         = standard-jvm
    - org.gradle.jvm.version             = 22
    - org.gradle.libraryelements         = composed-jar
    - org.gradle.usage                   = java-runtime
    - org.jetbrains.kotlin.platform.type = jvm
Artifacts
    - build/libs/subpr.jar (artifactType = jar)

--------------------------------------------------
Variant intellijPlatformDistribution
--------------------------------------------------
IntelliJ Platform distribution Zip archive

Capabilities
    - 123:subpr:unspecified (default capability)
Attributes
    - org.gradle.category                = library
    - org.gradle.dependency.bundling     = external
    - org.gradle.jvm.environment         = standard-jvm
    - org.gradle.jvm.version             = 22
    - org.gradle.libraryelements         = distribution
    - org.gradle.usage                   = java-runtime
    - org.jetbrains.kotlin.platform.type = jvm

--------------------------------------------------
Variant mainSourceElements (i)
--------------------------------------------------
List of source directories contained in the Main SourceSet.

Capabilities
    - 123:subpr:unspecified (default capability)
Attributes
    - org.gradle.category            = verification
    - org.gradle.dependency.bundling = external
    - org.gradle.verificationtype    = main-sources
Artifacts
    - src/main/java (artifactType = directory)
    - src/main/resources (artifactType = directory)

--------------------------------------------------
Variant runtimeElements
--------------------------------------------------
Runtime elements for the 'main' feature.

Capabilities
    - 123:subpr:unspecified (default capability)
Attributes
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.version         = 22
    - org.gradle.libraryelements     = jar
    - org.gradle.usage               = java-runtime
Artifacts
    - build/libs/subpr-base.jar (artifactType = jar, classifier = base)

Secondary Variants (*)

    --------------------------------------------------
    Secondary Variant classes
    --------------------------------------------------
    Directories containing compiled class files for main.

    Attributes
        - org.gradle.category            = library
        - org.gradle.dependency.bundling = external
        - org.gradle.jvm.version         = 22
        - org.gradle.libraryelements     = classes
        - org.gradle.usage               = java-runtime
    Artifacts
        - build/classes/java/main (artifactType = java-classes-directory)

    --------------------------------------------------
    Secondary Variant resources
    --------------------------------------------------
    Directories containing assembled resource files for main.

    Attributes
        - org.gradle.category            = library
        - org.gradle.dependency.bundling = external
        - org.gradle.jvm.version         = 22
        - org.gradle.libraryelements     = resources
        - org.gradle.usage               = java-runtime
    Artifacts
        - build/resources/main (artifactType = java-resources-directory)

--------------------------------------------------
Variant testResultsElementsForTest (i)
--------------------------------------------------
Directory containing binary results of running tests for the test Test Suite's test target.

Capabilities
    - 123:subpr:unspecified (default capability)
Attributes
    - org.gradle.category              = verification
    - org.gradle.testsuite.name        = test
    - org.gradle.testsuite.target.name = test
    - org.gradle.testsuite.type        = unit-test
    - org.gradle.verificationtype      = test-results
Artifacts
    - build/test-results/test/binary (artifactType = directory)

(l) Legacy or deprecated configuration. Those are variants created for backwards compatibility which are both resolvable and consumable.
(i) Configuration uses incubating attributes such as Category.VERIFICATION.
(*) Secondary variants are variants created via the Configuration#getOutgoing(): ConfigurationPublications API which also participate in selection, in addition to the configuration itself.

BUILD SUCCESSFUL in 412ms
1 actionable task: 1 executed
sasha@sasha-kubuntu:~/sources/test-java-lib $ gradle resolvableConfigurations

> Task :resolvableConfigurations
--------------------------------------------------
Configuration annotationProcessor
--------------------------------------------------
Annotation processors and their dependencies for source set 'main'.

Attributes
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.environment     = standard-jvm
    - org.gradle.libraryelements     = jar
    - org.gradle.usage               = java-runtime

--------------------------------------------------
Configuration compileClasspath
--------------------------------------------------
Compile classpath for source set 'main'.

Attributes
    - intellijPlatformCollected      = true
    - intellijPlatformExtracted      = true
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.environment     = standard-jvm
    - org.gradle.jvm.version         = 22
    - org.gradle.libraryelements     = composed-jar
    - org.gradle.usage               = java-api
Extended Configurations
    - compileOnly
    - implementation

--------------------------------------------------
Configuration intellijPlatformBundledModules
--------------------------------------------------
IntelliJ Platform bundled modules

--------------------------------------------------
Configuration intellijPlatformBundledPlugins
--------------------------------------------------
IntelliJ Platform bundled plugins

--------------------------------------------------
Configuration intellijPlatformDependencies
--------------------------------------------------
IntelliJ Platform extra dependencies

Extended Configurations
    - intellijPlatformBundledModules
    - intellijPlatformBundledPlugins
    - intellijPlatformPlugin
    - intellijPlatformPluginModule

--------------------------------------------------
Configuration intellijPlatformDependency
--------------------------------------------------
IntelliJ Platform

Attributes
    - intellijPlatformExtracted = true
Extended Configurations
    - intellijPlatformDependencyArchive
    - intellijPlatformLocal

--------------------------------------------------
Configuration intellijPlatformDependencyArchive
--------------------------------------------------
IntelliJ Platform dependency archive

--------------------------------------------------
Configuration intellijPlatformJavaCompiler
--------------------------------------------------
Java Compiler used by Ant tasks

--------------------------------------------------
Configuration intellijPlatformLocal
--------------------------------------------------
IntelliJ Platform local

Attributes
    - intellijPlatformExtracted = true

--------------------------------------------------
Configuration intellijPlatformPlugin
--------------------------------------------------
IntelliJ Platform plugins

Attributes
    - intellijPlatformExtracted              = true
    - intellijPlatformLocalPluginsNormalized = true
    - org.gradle.libraryelements             = distribution
Extended Configurations
    - intellijPlatformPluginDependency
    - intellijPlatformPluginLocal

--------------------------------------------------
Configuration intellijPlatformPluginDependency
--------------------------------------------------
IntelliJ Platform plugin dependencies

--------------------------------------------------
Configuration intellijPlatformPluginDependencyCollector
--------------------------------------------------
IntelliJ Platform plugin dependencies internal collector

Extended Configurations
    - intellijPlatformPluginDependency
    - intellijPlatformPluginLocal

--------------------------------------------------
Configuration intellijPlatformPluginLocal
--------------------------------------------------
IntelliJ Platform plugin local

Attributes
    - intellijPlatformExtracted  = false
    - org.gradle.libraryelements = distribution

--------------------------------------------------
Configuration intellijPlatformPluginModule
--------------------------------------------------
IntelliJ Platform plugin module

Attributes
    - org.gradle.libraryelements = composed-jar

--------------------------------------------------
Configuration intellijPlatformRuntimeClasspath
--------------------------------------------------
IntelliJ Platform Runtime Classpath resolvable configuration

Attributes
    - org.gradle.libraryelements = composed-jar
Extended Configurations
    - runtimeClasspath

--------------------------------------------------
Configuration intellijPlatformTestClasspath
--------------------------------------------------
IntelliJ Platform Test Classpath resolvable configuration

Attributes
    - intellijPlatformCollected  = true
    - intellijPlatformExtracted  = true
    - org.gradle.libraryelements = composed-jar
Extended Configurations
    - intellijPlatformDependencies
    - intellijPlatformDependency
    - intellijPlatformTestDependencies

--------------------------------------------------
Configuration intellijPlatformTestDependencies
--------------------------------------------------
IntelliJ Platform Test Dependencies

--------------------------------------------------
Configuration intellijPluginVerifier
--------------------------------------------------
IntelliJ Plugin Verifier

--------------------------------------------------
Configuration intellijPluginVerifierIdes
--------------------------------------------------
IntelliJ Plugin Verifier IDEs

Attributes
    - intellijPlatformExtracted = true
Extended Configurations
    - intellijPluginVerifierIdesDependency
    - intellijPluginVerifierIdesLocalInstance

--------------------------------------------------
Configuration intellijPluginVerifierIdesDependency
--------------------------------------------------
IntelliJ Plugin Verifier IDE dependencies

Attributes
    - intellijPlatformExtracted = false

--------------------------------------------------
Configuration intellijPluginVerifierIdesLocalInstance
--------------------------------------------------
IntelliJ Plugin Verifier IDE local

Attributes
    - intellijPlatformExtracted = true

--------------------------------------------------
Configuration jetbrainsRuntime
--------------------------------------------------
JetBrains Runtime

Attributes
    - intellijPlatformExtracted = true
Extended Configurations
    - jetbrainsRuntimeDependency
    - jetbrainsRuntimeLocalInstance

--------------------------------------------------
Configuration jetbrainsRuntimeDependency
--------------------------------------------------
JetBrains Runtime dependency archive

Attributes
    - intellijPlatformExtracted = false

--------------------------------------------------
Configuration jetbrainsRuntimeLocalInstance
--------------------------------------------------
JetBrains Runtime local instance

Attributes
    - intellijPlatformExtracted = true

--------------------------------------------------
Configuration marketplaceZipSigner
--------------------------------------------------
Marketplace ZIP Signer

--------------------------------------------------
Configuration runtimeClasspath
--------------------------------------------------
Runtime classpath of source set 'main'.

Attributes
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.environment     = standard-jvm
    - org.gradle.jvm.version         = 22
    - org.gradle.libraryelements     = jar
    - org.gradle.usage               = java-runtime
Extended Configurations
    - implementation
    - runtimeOnly

--------------------------------------------------
Configuration testAnnotationProcessor
--------------------------------------------------
Annotation processors and their dependencies for source set 'test'.

Attributes
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.environment     = standard-jvm
    - org.gradle.libraryelements     = jar
    - org.gradle.usage               = java-runtime

--------------------------------------------------
Configuration testCompileClasspath
--------------------------------------------------
Compile classpath for source set 'test'.

Attributes
    - intellijPlatformCollected      = true
    - intellijPlatformExtracted      = true
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.environment     = standard-jvm
    - org.gradle.jvm.version         = 22
    - org.gradle.libraryelements     = composed-jar
    - org.gradle.usage               = java-api
Extended Configurations
    - testCompileOnly
    - testImplementation

--------------------------------------------------
Configuration testRuntimeClasspath
--------------------------------------------------
Runtime classpath of source set 'test'.

Attributes
    - org.gradle.category            = library
    - org.gradle.dependency.bundling = external
    - org.gradle.jvm.environment     = standard-jvm
    - org.gradle.jvm.version         = 22
    - org.gradle.libraryelements     = jar
    - org.gradle.usage               = java-runtime
Extended Configurations
    - testImplementation
    - testRuntimeOnly

--------------------------------------------------
Compatibility Rules
--------------------------------------------------
The following Attributes have compatibility rules defined.

    - org.gradle.dependency.bundling
    - org.gradle.jvm.environment
    - org.gradle.jvm.version
    - org.gradle.libraryelements
    - org.gradle.plugin.api-version
    - org.gradle.usage

--------------------------------------------------
Disambiguation Rules
--------------------------------------------------
The following Attributes have disambiguation rules defined.

    - org.gradle.category (1)
    - org.gradle.dependency.bundling (5)
    - org.gradle.jvm.environment (6)
    - org.gradle.jvm.version (3)
    - org.gradle.libraryelements (4)
    - org.gradle.plugin.api-version
    - org.gradle.usage (2)

(#): Attribute disambiguation precedence


BUILD SUCCESSFUL in 412ms
1 actionable task: 1 executed


### Steps to reproduce

In the description.

### Gradle IntelliJ Plugin version

2.1.0

### Gradle version

8.10.2

### Operating System

Linux

### Link to build, i.e. failing GitHub Action job

_No response_
@AlexanderBartash AlexanderBartash changed the title Gradle's api & compileOnlyApi configurations created by its java-library plugin do not work, when this plugin is used Gradle's api & compileOnlyApi configurations created by its java-library plugin do not work, and transitive implementation scope dependencies get exposed, when this plugin is used Oct 16, 2024
AlexanderBartash added a commit to AlexanderBartash/intellij-platform-gradle-plugin that referenced this issue Oct 16, 2024
…arApi (extends api & compileOnlyApi) configuration with JAVA_API usage attribute value. Also replaced java plugin by java-library plugin, because it is a more proper plugin for IntelliJ plugin projects (they are libraries).
AlexanderBartash added a commit to AlexanderBartash/intellij-platform-gradle-plugin that referenced this issue Oct 16, 2024
…arApi (extends api & compileOnlyApi) configuration with JAVA_API usage attribute value. Also replaced java plugin by java-library plugin, because it is a more proper plugin for IntelliJ plugin projects (they are libraries).
AlexanderBartash added a commit to AlexanderBartash/intellij-platform-gradle-plugin that referenced this issue Oct 21, 2024
…arApi (extends api & compileOnlyApi) configuration with JAVA_API usage attribute value. Also replaced java plugin by java-library plugin, because it is a more proper plugin for IntelliJ plugin projects (they are libraries).
AlexanderBartash added a commit to AlexanderBartash/intellij-platform-gradle-plugin that referenced this issue Oct 22, 2024
…arApi (extends api & compileOnlyApi) configuration with JAVA_API usage attribute value. Also replaced java plugin by java-library plugin, because it is a more proper plugin for IntelliJ plugin projects (they are libraries).
@hsz hsz closed this as completed in #1800 Oct 22, 2024
@hsz hsz closed this as completed in 53bce55 Oct 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment