【问题标题】:how to copy all source jars using gradle如何使用 gradle 复制所有源 jar
【发布时间】:2013-04-15 18:55:44
【问题描述】:

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

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

谢谢, 院长

【问题讨论】:

    标签: gradle


    【解决方案1】:

    这并不像预期的那么简单。以下 sn -p 将 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 的原因是,如果源工件无法解析,我们不希望失败。可能有更优雅的方式,但我还没有深入研究。

    希望对你有帮助,

    勒内

    【讨论】:

    • 脚本中似乎有错误,resolvedConfigurationfrom(..) 语句中拼写了两次。此外,此代码下载源仅用于直接依赖项,而不用于传递项,请参阅我的答案。
    • @eskatos 我已经删除了重复的resolvedConfiguration
    【解决方案2】:

    Rene answer 将下载直接依赖的源 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/' )
    }
    

    然后可以通过将 classifier 更改为 javadoc 来对 javadocs jar 执行相同的操作。

    【讨论】:

      【解决方案3】:

      这里是用 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"))
          }
      }
      

      【讨论】:

      • 出于某种原因,这也复制了 JAR 的一个子集,包括类。我只是添加了 .filter {it.name.endsWith("-sources.jar")} 来修复它。
      猜你喜欢
      • 2012-04-26
      • 2012-07-13
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      相关资源
      最近更新 更多