【问题标题】:Gradle analogue for maven assembly pluginmaven 程序集插件的 Gradle 模拟
【发布时间】:2014-10-13 10:56:33
【问题描述】:

我在我的项目中使用程序集 maven 插件,以单个 zip 文件从 src/main/scripts/ 文件夹交付 jars、procrun 可执行文件和一些脚本。我怎么能用gradle做到这一点? 我见过 gradle 交付和应用程序插件,但我无法正确配置它们。

【问题讨论】:

  • 您到底想做什么?您能否提供任何示例输入和预期输出?
  • 这说明不了什么。
  • @Opal 我在src/main/scripts/ 目录中有一些文件。有*.exe、*.sh、*.bat 文件。 Maven 处理它们转换变量,如 ${project.build.finalName}.${project.packaging},然后使用 bin/,lib/,conf/ 文件夹创建存档。 bin/ 包含具有 0744 权限的脚本和 exe 文件,lib/ 包含我的项目及其依赖项的 jar,conf/ 包含来自 src/main/resources/ 的文件

标签: java maven gradle maven-assembly-plugin


【解决方案1】:

Maven 程序集可以轻松替换 Gradle 的 distribution plugin。配置由两部分组成。

配置分发

配置的第一部分是分发内容的声明:

apply plugin: 'distribution'

distributions {
  main {
   baseName = project.name
    contents {
      into('lib/') {  // Copy the following jars to the lib/ directory in the distribution archive
        from jar
        from configurations.runtimeClasspath
        dirMode = 0755
        fileMode = 0644
      }
      from('src/main/dist') {  // Contents of this directory are copied by default
        dirMode = 0755
        fileMode = 0644
      }
    }
  }
}

contents 部分只是一个示例。根据您的项目,您可能想在这里做不同的事情。配置选项的描述可以在 AbstractCopyTask 的 Javadocs 和它实现的接口中找到。

src/main/dist 中的文件会自动添加到分发中。即使出版物中没有通讯员from 声明。第二个路径元素必须与分配的名称匹配(在我的示例中为 main)。我在示例中列出了目录,因为我需要在复制的文件上设置 fileModedirMode 属性。

过滤文件

也可以使用AbstractCopyTask 中定义的filter() 方法之一过滤文件。

下面的示例使用ReplaceTokens 过滤器。它替换了 ant 样式的占位符,格式如下:@placeholder@

import org.apache.tools.ant.filters.ReplaceTokens

contents {  // contents section in distribution
  from('src/main/scripts') {
    filter(ReplaceTokens, tokens: [placeholder: 'replacement-string' ])
    filteringCharset = 'UTF-8'
  }
}

这将从 src/main/scripts 目录中复制的所有文件中的字符串 @placeholder@ 替换为分发存档中的“replacement-string”。

ContentFilterable 的 Javadocs 描述了过滤文件的一些替代方法。

配置文件归档

配置的第二部分允许管理生成的存档文件的文件格式特定功能。这些设置是可选的,只有在您对标准存档的格式不满意时才需要。

默认情况下,Gradle 不会压缩它生成的 tar 存档。下面的示例配置 distTar 任务以使用 gzip 压缩 tar 文件。由于文件通常以 .tar.gz 文件的形式分发,而不仅仅是 tar 文件,因此最好将其添加到构建中:

distTar {
  compression = Compression.GZIP
  extension = 'tar.gz'
  classifier = 'dist'  // Appends a suffix to the file name
}

有关所有配置选项的说明,请参阅Tar task

zip 存档的配置方式与 tar 存档相同。这个例子只是在文件名的末尾添加了一个分类器字符串:

distZip {
  classifier = 'dist'
}

有关其他配置选项的说明,请参阅Tar task

构建分发档案

分发档案是作为assemble 任务的一部分创建的。运行 gradle buildgradle assemble 将生成它们。

【讨论】:

  • @glebiuskv 我注意到您需要过滤分发中的文件。我在我的答案中添加了一个关于此的部分。如果您可以将此要求从评论移至我认为的问题,那将很有帮助。
【解决方案2】:

查看 Copy 和 Zip 任务,根据我的经验,它们可以做的不仅仅是 具有较少仪式的组装插件

https://docs.gradle.org/3.5/javadoc/org/gradle/api/tasks/Copy.html https://docs.gradle.org/3.5/javadoc/org/gradle/api/tasks/bundling/Zip.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多