9

我们有一个旧的 playframework 1.2.x 版本,我们将所有 jar 复制到 project/lib 以便 playframework 可以使用它们。我们也希望复制所有源 jar,以便在运行 eclipsify 时,我们可以查看所有第三方源。有没有办法用gradle做到这一点?

我的意思是当我运行 gradle eclipse 时下载的所有源 jar,因为我看到它们下载缓存位置。我们在一个项目上也有 gradle eclipse 为我们调用 play eclipsify,所以我们可以 100% 只使用 gradle。

谢谢,院长

4

3 回答 3

7

这并不像预期的那样直截了当。以下代码段将 java 项目的所有依赖项(运行时 + 编译)的源 jar 复制到特定文件夹中:

    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')
    }

我们在这里使用 lenientConfiguration 的原因是,如果源工件无法解析,我们不希望失败。可能有更优雅的方式,但我还没有深入研究。

希望能帮助到你,

勒内

于 2013-04-25T21:51:39.290 回答
6

Rene 答案将下载直接依赖项的源 jar,而不是所有传递依赖项的源 jar。

这是一个可以解决问题的任务:

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/' )
}

然后可以通过classifierjavadoc.

于 2015-07-16T10:26:44.860 回答
2

这里用 Kotlin DSL 翻译的 eskatos 解决方案:

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"))
    }
}
于 2018-03-20T08:10:08.000 回答