Dean Hiller
Dean Hiller

Reputation: 20190

how to copy all source jars using gradle

We have an old playframework 1.2.x version where we copy all the jars to project/lib so playframework can consume them. We would LOVE to copy all the source jars as well so that when runnig play eclipsify, we can view all the third party source. Is there a way to do this with gradle?

and I mean all the source jars that were downloaded when I ran gradle eclipse as I saw them download the cache locations. We have gradle eclipse calling play eclipsify for us on the one project as well so we can 100% just use gradle.

thanks, Dean

Upvotes: 9

Views: 3290

Answers (3)

Fraquack
Fraquack

Reputation: 93

Here eskatos solution translated in Kotlin DSL:

tasks {
    "copySourceJars"(Copy::class) {
        val sources = configurations.runtime.resolvedConfiguration.resolvedArtifacts.map {
            with(it.moduleVersion.id) { 
                dependencies.create(group, name, version, classifier = "sources") 
            }
        }
        from(
            configurations.detachedConfiguration(*sources.toTypedArray())
                .resolvedConfiguration.lenientConfiguration.getFiles(Specs.SATISFIES_ALL)
        )
        into(File("some-directory"))
    }
}

Upvotes: 2

Rene Groeschke
Rene Groeschke

Reputation: 28653

this is not that straight forward as expected. The following snippet copies the source jars for all dependencies (runtime + compile) of a java project into a specific folder:

    task copySourceJars(type:Copy){
        def deps = configurations.runtime.incoming.dependencies.collect{ dependency ->
            dependency.artifact { artifact ->
                    artifact.name = dependency.name
                    artifact.type = 'source'
                    artifact.extension = 'jar'
                    artifact.classifier = 'sources'
                }
            dependency
        }
        from(configurations.detachedConfiguration(deps as Dependency[]).resolvedConfiguration.lenientConfiguration.getFiles(Specs.SATISFIES_ALL))
        into('sourceLibs')
    }

The reason we use a lenientConfiguration here is, that we don't want to fail if a source artifact cannot be resolved. There might be a more elegant way, but I havn't looked deeper into that.

hope it helps,

René

Upvotes: 7

eskatos
eskatos

Reputation: 4434

Rene answer will download sources jars of direct dependencies, not sources jars of all transitives dependencies.

Here is a task that will do the trick:

task copySourceJars( type: Copy ) {
  def sources = configurations.runtime.resolvedConfiguration.resolvedArtifacts.collect { artifact ->
    project.dependencies.create( [
      group: artifact.moduleVersion.id.group,
      name: artifact.moduleVersion.id.name,
      version: artifact.moduleVersion.id.version,
      classifier: 'sources'
    ] )
  }
  from configurations.detachedConfiguration( sources as Dependency[] )
    .resolvedConfiguration.lenientConfiguration.getFiles( Specs.SATISFIES_ALL )
  into file( 'some-directory/' )
}

One can then do the very same for javadocs jars by changing the classifier to javadoc.

Upvotes: 6

Related Questions