1
votes

I've got a gradle file which is working in some ancient version of gradle but I want to upgrade to gradle 5.0. Unfortunately its using ivy rather than maven to publish its jars. I've cut it down to a simple test case.

I'm not sure if I'm missing something or its a bug or what. I've attached the gradle below. I'm running it

./gradlew wrapper && ./gradlew publish --info && cat build/publications/ivy/ivy.xml
  • It works as expected with 4.7. It publishes the main jar and the source jar and adds the dependencies.
  • If I switch to 4.8 it breaks, it only publishes the source jar, main jar and dependencies are missing.
  • If I switch to 4.8 and comment out the configurations bit it publishes the main jar and dependencies again.

Perhaps there's a new way of doing things but if so I've failed to find where its documented. Here's the source build.gradle.

plugins {
  id 'java'
  id 'ivy-publish'
}   

sourceSets {
  testSupport {
    java {
      compileClasspath += main.output
      runtimeClasspath += main.output
    }
  }
  test {
    java {
      compileClasspath += testSupport.output
      runtimeClasspath += testSupport.output
    }
  }
}

dependencies {
  compile group: 'com.ibm.icu', name: 'icu4j', version: '58.2'
  compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3'
  compile group: 'io.swagger', name: 'swagger-parser', version: '1.0.32'
}

task sourceJar(type: Jar) {
  from sourceSets.main.allJava
}

task testSupportJar(type: Jar) {
  from sourceSets.testSupport.output
  appendix "test-support"
}

task testSupportSourceJar(type: Jar) {
  from sourceSets.testSupport.java.srcDirs
  appendix "test-support-sources"
}
artifacts {
  archives sourceJar
  archives testSupportJar
  archives testSupportSourceJar
}
publishing {
  repositories {
    ivy {
      name = 'myRepo'
      url = "file://${buildDir}/repo"
      layout "pattern", {
        artifact "[organisation]/[module]/[revision]/jars/[artifact].[ext]"
        ivy "[organisation]/[module]/[revision]/ivys/ivy-[revision].xml"
      }
    }
  }
  publications {
    ivy(IvyPublication) {
      organisation = 'com.example.com'
      // If you comment out the configurations below it will generate sensible ivy.xml
      configurations {
        "compile" {}
        "runtime" {}
      } 


      from components.java
      artifact(sourceJar) {
        type "source"
        extension "src.jar"
        conf "runtime"
      }
    }
  }
}

wrapper {
  // 4.7 works but 4.8+ doesn't.
  gradleVersion = '4.7'
}
1

1 Answers

0
votes

Oh man I just figured it out. Its the relative ordering of from components.java and the configurations element bits. If configurations is first it seems to take precedence over from components.java and the latter is seemingly ignored. If you put from components.java before configurations it works and you don't have to manually declare the configs it generates by default any more.

FFS gradle.