Skip to content

Latest commit

 

History

History
67 lines (56 loc) · 2.32 KB

publishing.md

File metadata and controls

67 lines (56 loc) · 2.32 KB

Publishing

An assortment of problems I've encountered with maven publishing via Gradle and how to solve them.

The gradle MavenPublication is including dependencies I marked as implementation and runtimeOnly and I don't want that

I addressed this by transforming the output XML via pom.withXml { ... }.

publishing {
    publications {
        myLib(MavenPublication) {
            // This will add the dependencies you don't want, we'll just transform the xml after the fact
            from components.java
            
            pom.withXml {
                // getAt(String) wraps the results in 'NodeList'
                // NodeList extends ArrayList, so we can do 'removeIf(Predicate<T>)'
                // So we extract the single item with 'get(0)'
                def node = asNode().getAt('dependencies').get(0)
                
                // Remove block nodes of 'implementation' and 'runtimeOnly' dependencies
                node.children().removeIf(c -> isRuntimeDependency(c))
            }
        }
    }
    
    // I'm publishing to a local directory.
    repositories {
        maven {
            name = 'staging_deploy'
            url = layout.buildDirectory.dir('staging-deploy')
        }
    }
}

// Dependencies get mapped to 'compile' or 'runtime' scoped entries in XML.
//
// This assumes your setup is set up such that:
//  - api: Consumers must resolve this dependency I use too
//  - implementation: Consumers are not required to resolve this dependency I use
//
// In my setup this means I want to remove anything that is output as a 'runtime' XML dependency.
// If your setup is different its on you to change how this method works.
// 
// To figure out what calls you can make, see:
//  - https://docs.groovy-lang.org/latest/html/api/groovy/util/Node.html
//  - https://docs.groovy-lang.org/latest/html/api/groovy/util/NodeList.html
private static boolean isRuntimeDependency(Node node) {
    String scope = node.get("scope").text()
    return "runtime".equals(scope)
}

Using the java-test-fixtures adds the project as a dependency in the pom to itself, breaking :publish

Just don't use java-test-fixtures. I know, that "tip" sucks, but so does Gradle.

sourceSets {
    test {
        java {
            srcDirs 'src/testFixtures/java', 'src/test/java'
        }
    }
}