stempler / bnd-platform

Build OSGi bundles and Eclipse Update Sites from existing JARs, e.g. from Maven repositories (Plugin for Gradle)
Apache License 2.0
79 stars 30 forks source link

Cannot exclude plugins from feature #28

Closed Treehopper closed 7 years ago

Treehopper commented 7 years ago

Thanks for contributing this great tool! It worked perfectly for me so far, but I stumbled over one issue.

Using the 'exclude group' statement for a plugin in a defined feature seems to have no effect, or I maybe misunderstood its purpose. I created a minimal example to illustrate this:

buildscript {
    repositories {
        jcenter()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'org.standardout:bnd-platform:1.4.0'
    }
}

apply plugin: 'org.standardout.bnd-platform'

repositories {
    mavenCentral()
}

dependencies {
    platform 'org.codehaus.groovy.modules.http-builder:http-builder:0.6'
}

platform {
    bundle 'org.codehaus.groovy.modules.http-builder:http-builder:0.6'

    feature(id: 'platform.restclient', name: 'REST client dependencies', version: '1.0.0') {
         // define what's in the feature
         plugin 'org.codehaus.groovy.modules.http-builder:http-builder:0.6', {
             // exclude this transitive dependency
             exclude group: 'net.sourceforge.nekohtml', module: 'nekohtml'
        }
    }

    // If you have an Eclipse installation available, you may want to set the env. variable
    // ECLIPSE_HOME with its path, that will prevent the BND plugin to download it.
    // As of today, the version downloaded by default is:
    // http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/indigo/SR2/eclipse-rcp-indigo-SR2-win32-x86_64.zip
    if ( System.getenv("ECLIPSE_HOME") != null )
        eclipseHome  = new File(System.getenv("ECLIPSE_HOME"))
}

This should create an update site with a feature, composed of all transitive dependencies of the http-builder, except 'net.sourceforge.nekohtml'. Right? However, in the resulting feature.xml I find the following:

<plugin id="net.sourceforge.nekohtml" download-size="0" install-size="0" version="1.9.16.bnd-y0MRJw" unpack="false" />
<plugin id="net.sourceforge.nekohtml.source" download-size="0" install-size="0" version="1.9.16.bnd-y0MRJw" unpack="false" />

I use these commands to run the build:

export ECLIPSE_HOME="C:/your_eclipse_install"
gradle updateSiteZip
stempler commented 7 years ago

You have the dependency to the http-builder module defined both via platform.bundle and platform.feature.plugin. Try removing the platform.bundle definition (which does not have the exclude).

The exclude is actually a mechanism of Gradle core, you can check the dependencies that Gradle resolves for your project with gradle dependencies. Check there (platform configuration) if the excluded dependency is still there and if so, where it shows up.

Treehopper commented 7 years ago

Thanks for your quick reply! I think I got it now. Additional to removing platform.bundle definition, I had to remove the dependencies block. Here is the updated example:

buildscript {
    repositories {
        jcenter()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'org.standardout:bnd-platform:1.4.0'
    }
}

apply plugin: 'org.standardout.bnd-platform'

repositories {
    mavenCentral()
}

platform {
    feature(id: 'platform.restclient', name: 'REST client dependencies', version: '1.0.0') {
         // define what's in the feature
         plugin 'org.codehaus.groovy.modules.http-builder:http-builder:0.6', {
             // exclude this transitive dependency
             exclude group: 'net.sourceforge.nekohtml', module: 'nekohtml'
        }
    }

    // If you have an Eclipse installation available, you may want to set the env. variable
    // ECLIPSE_HOME with its path, that will prevent the BND plugin to download it.
    // As of today, the version downloaded by default is:
    // http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/indigo/SR2/eclipse-rcp-indigo-SR2-win32-x86_64.zip
    if ( System.getenv("ECLIPSE_HOME") != null )
        eclipseHome  = new File(System.getenv("ECLIPSE_HOME"))
}

I think this can be closed. Thanks for your help!

stempler commented 7 years ago

Ah yes, exactly, the dependency was actually added three times.