War - Gradle DSL Version 4.8

# War

API Documentation: | `War`

Assembles a WAR archive.

### Properties

Property | Description
`appendix` | The appendix part of the archive name, if any.
`archiveName` | The archive name. If the name has not been explicitly set, the pattern for the name is: `[baseName]-[appendix]-[version]-[classifier].[extension]`
`archivePath` | The path where the archive is constructed. The path is simply the `destinationDir` plus the `archiveName`.
`baseName` | The base name of the archive.
`caseSensitive` | Specifies whether case-sensitive pattern matching should be used.
`classifier` | The classifier part of the archive name, if any.
`classpath` | The classpath to include in the WAR archive. Any JAR or ZIP files in this classpath are included in the `WEB-INF/lib` directory. Any directories in this classpath are included in the `WEB-INF/classes` directory.
`destinationDir` | The directory where the archive is generated into.
`dirMode` | The Unix permissions to use for the target directories. `null` means that existing permissions are preserved. It is dependent on the copy action implementation whether these permissions will actually be applied.
`duplicatesStrategy` | The strategy to use when trying to copy more than one file to the same destination.
`entryCompression` | The compression level of the entries of the archive. If set to `ZipEntryCompression.DEFLATED` (the default), each entry is compressed using the DEFLATE algorithm. If set to `ZipEntryCompression.STORED` the entries of the archive are left uncompressed.
`excludes` | The set of exclude patterns.
`extension` | The extension part of the archive name.
`fileMode` | The Unix permissions to use for the target files. `null` means that existing permissions are preserved. It is dependent on the copy action implementation whether these permissions will actually be applied.
`includeEmptyDirs` | Tells if empty target directories will be included in the copy.
`includes` | The set of include patterns.
`manifest` | Incubating The manifest for this JAR archive.
`metadataCharset` | Incubating The character set used to encode JAR metadata like file names. Defaults to UTF-8. You can change this property but it is not recommended as JVMs expect JAR metadata to be encoded using UTF-8
`preserveFileTimestamps` | Incubating Specifies whether file timestamps should be preserved in the archive.
`reproducibleFileOrder` | Incubating Specifies whether to enforce a reproducible file order when reading files from directories.
`source` | The source files for this task.
`version` | The version part of the archive name, if any.
`webXml` | The `web.xml` file to include in the WAR archive. When `null`, no `web.xml` file is included in the WAR.
`zip64` | Incubating Whether the zip can contain more than 65535 files and/or support files greater than 4GB in size.

### Methods

Method | Description
`classpath(classpath)` | Adds files to the classpath to include in the WAR archive.
`eachFile(closure)` | Adds an action to be applied to each file as it about to be copied into its destination. The given closure is called with a `FileCopyDetails` as its parameter. Actions are executed in the order added, and are inherited from the parent spec.
`eachFile(action)` | Adds an action to be applied to each file as it is about to be copied into its destination. The action can change the destination path of the file, filter the contents of the file, or exclude the file from the result entirely. Actions are executed in the order added, and are inherited from the parent spec.
`exclude(excludeSpec)` | Adds an exclude spec. This method may be called multiple times to append new specs.The given closure is passed a `FileTreeElement` as its parameter. The closure should return true or false. Example:
`exclude(excludes)` | Adds an ANT style exclude pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.
`exclude(excludes)` | Adds an ANT style exclude pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.
`exclude(excludeSpec)` | Adds an exclude spec. This method may be called multiple times to append new specs. If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.
`expand(properties)` | Expands property references in each file as it is copied. More specifically, each file is transformed using Groovy's `SimpleTemplateEngine`. This means you can use simple property references, such as `$property` or `${property}` in the file. You can also include arbitrary Groovy code in the file, such as `${version ?: 'unknown'}` or `${classpath*.name.join(' ')}`
`filesMatching(patterns, action)` | Configure the `FileCopyDetails` for each file whose path matches any of the specified Ant-style patterns. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.
`filesMatching(pattern, action)` | Configure the `FileCopyDetails` for each file whose path matches the specified Ant-style pattern. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.
`filesNotMatching(patterns, action)` | Configure the `FileCopyDetails` for each file whose path does not match any of the specified Ant-style patterns. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.
`filesNotMatching(pattern, action)` | Configure the `FileCopyDetails` for each file whose path does not match the specified Ant-style pattern. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.
`filter(closure)` | Adds a content filter based on the provided closure. The Closure will be called with each line (stripped of line endings) and should return a String to replace the line or `null` to remove the line. If every line is removed, the result will be an empty file, not an absent one.
`filter(filterType)` | Adds a content filter to be used during the copy. Multiple calls to filter, add additional filters to the filter chain. Each filter should implement `java.io.FilterReader`. Include `org.apache.tools.ant.filters.*` for access to all the standard Ant filters.
`filter(properties, filterType)` | Adds a content filter to be used during the copy. Multiple calls to filter, add additional filters to the filter chain. Each filter should implement `java.io.FilterReader`. Include `org.apache.tools.ant.filters.*` for access to all the standard Ant filters.
`filter(transformer)` | Adds a content filter based on the provided transformer. The Closure will be called with each line (stripped of line endings) and should return a String to replace the line or `null` to remove the line. If every line is removed, the result will be an empty file, not an absent one.
`from(sourcePath, c)` | Specifies the source files or directories for a copy and creates a child `CopySourceSpec`. The given source path is evaluated as per `Project.files(java.lang.Object[])` .
`from(sourcePath, configureAction)` | Specifies the source files or directories for a copy and creates a child `CopySpec`. The given source path is evaluated as per `Project.files(java.lang.Object[])` .
`from(sourcePaths)` | Specifies source files or directories for a copy. The given paths are evaluated as per `Project.files(java.lang.Object[])`.
`include(includeSpec)` | Adds an include spec. This method may be called multiple times to append new specs. The given closure is passed a `FileTreeElement` as its parameter. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns or specs to be included.
`include(includes)` | Adds an ANT style include pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns to be processed.
`include(includes)` | Adds an ANT style include pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns to be processed.
`include(includeSpec)` | Adds an include spec. This method may be called multiple times to append new specs. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns or specs to be included.
`into(destPath)` | Specifies the destination directory *inside* the archive for the files. The destination is evaluated as per `Project.file(java.lang.Object)`. Don't mix it up with `AbstractArchiveTask.getDestinationDir()` which specifies the output directory for the archive.
`into(destPath, configureClosure)` | Creates and configures a child `CopySpec` with a destination directory *inside* the archive for the files. The destination is evaluated as per `Project.file(java.lang.Object)`. Don't mix it up with `AbstractArchiveTask.getDestinationDir()` which specifies the output directory for the archive.
`into(destPath, copySpec)` | Creates and configures a child `CopySpec` with a destination directory *inside* the archive for the files. The destination is evaluated as per `Project.file(java.lang.Object)`. Don't mix it up with `AbstractArchiveTask.getDestinationDir()` which specifies the output directory for the archive.
`manifest(configureClosure)` | Incubating Configures the manifest for this JAR archive.
`manifest(configureAction)` | Incubating Configures the manifest for this JAR archive.
`metaInf(configureClosure)` | Incubating Adds content to this JAR archive's META-INF directory.
`metaInf(configureAction)` | Incubating Adds content to this JAR archive's META-INF directory.
`rename(closure)` | Renames a source file. The closure will be called with a single parameter, the name of the file. The closure should return a String object with a new target name. The closure may return null, in which case the original name will be used.
`rename(sourceRegEx, replaceWith)` | Renames files based on a regular expression. Uses java.util.regex type of regular expressions. Note that the replace string should use the '$1' syntax to refer to capture groups in the source regular expression. Files that do not match the source regular expression will be copied with the original name.
`rename(sourceRegEx, replaceWith)` | Renames files based on a regular expression. See `CopyProcessingSpec.rename(java.lang.String, java.lang.String)`.
`rename(renamer)` | Renames a source file. The function will be called with a single parameter, the name of the file. The function should return a new target name. The function may return null, in which case the original name will be used.
`webInf(configureClosure)` | Adds some content to the `WEB-INF` directory for this WAR archive.
`webInf(configureAction)` | Adds some content to the `WEB-INF` directory for this WAR archive.
`with(sourceSpecs)` | Adds the given specs as a child of this spec.

### Script blocks

No script blocks

### Property details

#### `String` `appendix`

The appendix part of the archive name, if any.

Default with `war` plugin:
  `null`

#### `String` `archiveName`

The archive name. If the name has not been explicitly set, the pattern for the name is: `[baseName]-[appendix]-[version]-[classifier].[extension]`

Default with `war` plugin:
  ``${baseName}`-`${appendix}`-`${version}`-`${classifier}`.`${extension}``

#### `File` `archivePath` (read-only)

The path where the archive is constructed. The path is simply the `destinationDir` plus the `archiveName`.

Default with `war` plugin:
  ``${destinationDir}`/`${archiveName}``

#### `String` `baseName`

The base name of the archive.

Default with `war` plugin:
  `project.archivesBaseName`

#### `boolean` `caseSensitive`

Specifies whether case-sensitive pattern matching should be used.

Default with `war` plugin:
  `true`

#### `String` `classifier`

The classifier part of the archive name, if any.

Default with `war` plugin:
  `null`

#### `FileCollection` `classpath`

The classpath to include in the WAR archive. Any JAR or ZIP files in this classpath are included in the `WEB-INF/lib` directory. Any directories in this classpath are included in the `WEB-INF/classes` directory.

Default with `war` plugin:
  `project.configurations.runtime - project.configurations.providedRuntime`

#### `File` `destinationDir`

The directory where the archive is generated into.

Default with `war` plugin:
  `project.distsDir`

#### `Integer` `dirMode`

The Unix permissions to use for the target directories. `null` means that existing permissions are preserved. It is dependent on the copy action implementation whether these permissions will actually be applied.

Default with `war` plugin:
  `null`

#### `DuplicatesStrategy` `duplicatesStrategy`

The strategy to use when trying to copy more than one file to the same destination.

The value can be set with a case insensitive string of the enum value (e.g. `'exclude'` for `DuplicatesStrategy.EXCLUDE`).

This strategy can be overridden for individual files by using `CopySpec.eachFile(org.gradle.api.Action)` or `CopySpec.filesMatching(java.lang.String, org.gradle.api.Action)`.

Default with `war` plugin:
  `null`

#### `ZipEntryCompression` `entryCompression`

The compression level of the entries of the archive. If set to `ZipEntryCompression.DEFLATED` (the default), each entry is compressed using the DEFLATE algorithm. If set to `ZipEntryCompression.STORED` the entries of the archive are left uncompressed.

Default:
  `ZipEntryCompression.DEFLATED`

#### ``Set`<`String`>` `excludes`

The set of exclude patterns.

Default with `war` plugin:
  `[]`

#### `String` `extension`

The extension part of the archive name.

#### `Integer` `fileMode`

The Unix permissions to use for the target files. `null` means that existing permissions are preserved. It is dependent on the copy action implementation whether these permissions will actually be applied.

Default with `war` plugin:
  `null`

#### `boolean` `includeEmptyDirs`

Tells if empty target directories will be included in the copy.

Default with `war` plugin:
  `true`

#### ``Set`<`String`>` `includes`

The set of include patterns.

Default with `war` plugin:
  `[]`

#### `Manifest` `manifest`

Note: This property is incubating and may change in a future version of Gradle.

The manifest for this JAR archive.

#### `String` `metadataCharset`

Note: This property is incubating and may change in a future version of Gradle.

The character set used to encode JAR metadata like file names. Defaults to UTF-8. You can change this property but it is not recommended as JVMs expect JAR metadata to be encoded using UTF-8

#### `boolean` `preserveFileTimestamps`

Note: This property is incubating and may change in a future version of Gradle.

Specifies whether file timestamps should be preserved in the archive.

If `false` this ensures that archive entries have the same time for builds between different machines, Java versions and operating systems.

Default with `war` plugin:
  `true`

#### `boolean` `reproducibleFileOrder`

Note: This property is incubating and may change in a future version of Gradle.

Specifies whether to enforce a reproducible file order when reading files from directories.

Gradle will then walk the directories on disk which are part of this archive in a reproducible order independent of file systems and operating systems. This helps Gradle reliably produce byte-for-byte reproducible archives.

Default with `war` plugin:
  `false`

#### `FileCollection` `source` (read-only)

The source files for this task.

#### `String` `version`

The version part of the archive name, if any.

Default with `war` plugin:
  `project.version`

#### `File` `webXml`

The `web.xml` file to include in the WAR archive. When `null`, no `web.xml` file is included in the WAR.

Default with `war` plugin:
  `null`

#### `boolean` `zip64`

Note: This property is incubating and may change in a future version of Gradle.

Whether the zip can contain more than 65535 files and/or support files greater than 4GB in size.

The standard zip format has hard limits on file size and count. The Zip64 format extension practically removes these limits and is therefore required for building large zips.

However, not all Zip readers support the Zip64 extensions. Notably, the `ZipInputStream` JDK class does not support Zip64 for versions earlier than Java 7. This means you should not enable this property if you are building JARs to be used with Java 6 and earlier runtimes.

Default:
  `false`

### Method details

#### `void` `classpath`(``Object`...` classpath)

Adds files to the classpath to include in the WAR archive.

#### `AbstractCopyTask` `eachFile`(`Closure` closure)

Adds an action to be applied to each file as it about to be copied into its destination. The given closure is called with a `FileCopyDetails` as its parameter. Actions are executed in the order added, and are inherited from the parent spec.

#### `AbstractCopyTask` `eachFile`(``Action`<? super `FileCopyDetails`>` action)

Adds an action to be applied to each file as it is about to be copied into its destination. The action can change the destination path of the file, filter the contents of the file, or exclude the file from the result entirely. Actions are executed in the order added, and are inherited from the parent spec.

#### `AbstractCopyTask` `exclude`(`Closure` excludeSpec)

Adds an exclude spec. This method may be called multiple times to append new specs.The given closure is passed a `FileTreeElement` as its parameter. The closure should return true or false. Example:

    copySpec {
      from 'source'
      into 'destination'
      //an example of excluding files from certain configuration:
      exclude { it.file in configurations.someConf.files }
    }

If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.

#### `AbstractCopyTask` `exclude`(``Iterable`<`String`>` excludes)

Adds an ANT style exclude pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.

#### `AbstractCopyTask` `exclude`(``String`...` excludes)

Adds an ANT style exclude pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.

#### `AbstractCopyTask` `exclude`(``Spec`<`FileTreeElement`>` excludeSpec)

Adds an exclude spec. This method may be called multiple times to append new specs. If excludes are not provided, then no files will be excluded. If excludes are provided, then files must not match any exclude pattern to be processed.

#### `AbstractCopyTask` `expand`(``Map`<`String`, ?>` properties)

Expands property references in each file as it is copied. More specifically, each file is transformed using Groovy's `SimpleTemplateEngine`. This means you can use simple property references, such as `$property` or `${property}` in the file. You can also include arbitrary Groovy code in the file, such as `${version ?: 'unknown'}` or `${classpath*.name.join(' ')}`

#### `AbstractCopyTask` `filesMatching`(``Iterable`<`String`>` patterns, ``Action`<? super `FileCopyDetails`>` action)

Configure the `FileCopyDetails` for each file whose path matches any of the specified Ant-style patterns. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.

#### `AbstractCopyTask` `filesMatching`(`String` pattern, ``Action`<? super `FileCopyDetails`>` action)

Configure the `FileCopyDetails` for each file whose path matches the specified Ant-style pattern. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.

#### `AbstractCopyTask` `filesNotMatching`(``Iterable`<`String`>` patterns, ``Action`<? super `FileCopyDetails`>` action)

Configure the `FileCopyDetails` for each file whose path does not match any of the specified Ant-style patterns. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.

#### `AbstractCopyTask` `filesNotMatching`(`String` pattern, ``Action`<? super `FileCopyDetails`>` action)

Configure the `FileCopyDetails` for each file whose path does not match the specified Ant-style pattern. This is equivalent to using eachFile() and selectively applying a configuration based on the file's path.

#### `AbstractCopyTask` `filter`(`Closure` closure)

Adds a content filter based on the provided closure. The Closure will be called with each line (stripped of line endings) and should return a String to replace the line or `null` to remove the line. If every line is removed, the result will be an empty file, not an absent one.

#### `AbstractCopyTask` `filter`(``Class`<? extends `FilterReader`>` filterType)

Adds a content filter to be used during the copy. Multiple calls to filter, add additional filters to the filter chain. Each filter should implement `java.io.FilterReader`. Include `org.apache.tools.ant.filters.*` for access to all the standard Ant filters.

Examples:

    filter(StripJavaComments)
    filter(com.mycompany.project.CustomFilter)

#### `AbstractCopyTask` `filter`(``Map`<`String`, ?>` properties, ``Class`<? extends `FilterReader`>` filterType)

Adds a content filter to be used during the copy. Multiple calls to filter, add additional filters to the filter chain. Each filter should implement `java.io.FilterReader`. Include `org.apache.tools.ant.filters.*` for access to all the standard Ant filters.

Filter properties may be specified using groovy map syntax.

Examples:

    filter(HeadFilter, lines:25, skip:2)
    filter(ReplaceTokens, tokens:[copyright:'2009', version:'2.3.1'])

#### `AbstractCopyTask` `filter`(``Transformer`<`String`, `String`>` transformer)

Adds a content filter based on the provided transformer. The Closure will be called with each line (stripped of line endings) and should return a String to replace the line or `null` to remove the line. If every line is removed, the result will be an empty file, not an absent one.

#### `AbstractCopyTask` `from`(`Object` sourcePath, `Closure` c)

Specifies the source files or directories for a copy and creates a child `CopySourceSpec`. The given source path is evaluated as per `Project.files(java.lang.Object[])` .

#### `AbstractCopyTask` `from`(`Object` sourcePath, ``Action`<? super `CopySpec`>` configureAction)

Specifies the source files or directories for a copy and creates a child `CopySpec`. The given source path is evaluated as per `Project.files(java.lang.Object[])` .

#### `AbstractCopyTask` `from`(``Object`...` sourcePaths)

Specifies source files or directories for a copy. The given paths are evaluated as per `Project.files(java.lang.Object[])`.

#### `AbstractCopyTask` `include`(`Closure` includeSpec)

Adds an include spec. This method may be called multiple times to append new specs. The given closure is passed a `FileTreeElement` as its parameter. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns or specs to be included.

#### `AbstractCopyTask` `include`(``Iterable`<`String`>` includes)

Adds an ANT style include pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns to be processed.

#### `AbstractCopyTask` `include`(``String`...` includes)

Adds an ANT style include pattern. This method may be called multiple times to append new patterns and multiple patterns may be specified in a single call. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns to be processed.

#### `AbstractCopyTask` `include`(``Spec`<`FileTreeElement`>` includeSpec)

Adds an include spec. This method may be called multiple times to append new specs. If includes are not provided, then all files in this container will be included. If includes are provided, then a file must match at least one of the include patterns or specs to be included.

#### `AbstractArchiveTask` `into`(`Object` destPath)

Specifies the destination directory *inside* the archive for the files. The destination is evaluated as per `Project.file(java.lang.Object)`. Don't mix it up with `AbstractArchiveTask.getDestinationDir()` which specifies the output directory for the archive.

#### `AbstractArchiveTask` `into`(`Object` destPath, `Closure` configureClosure)

Creates and configures a child `CopySpec` with a destination directory *inside* the archive for the files. The destination is evaluated as per `Project.file(java.lang.Object)`. Don't mix it up with `AbstractArchiveTask.getDestinationDir()` which specifies the output directory for the archive.

#### `CopySpec` `into`(`Object` destPath, ``Action`<? super `CopySpec`>` copySpec)

Creates and configures a child `CopySpec` with a destination directory *inside* the archive for the files. The destination is evaluated as per `Project.file(java.lang.Object)`. Don't mix it up with `AbstractArchiveTask.getDestinationDir()` which specifies the output directory for the archive.

#### `Jar` `manifest`(``Closure`<?>` configureClosure)

Note: This method is incubating and may change in a future version of Gradle.

Configures the manifest for this JAR archive.

The given closure is executed to configure the manifest. The `Manifest` is passed to the closure as its delegate.

#### `Jar` `manifest`(``Action`<? super `Manifest`>` configureAction)

Note: This method is incubating and may change in a future version of Gradle.

Configures the manifest for this JAR archive.

The given action is executed to configure the manifest.

#### `CopySpec` `metaInf`(``Closure`<?>` configureClosure)

Note: This method is incubating and may change in a future version of Gradle.

Adds content to this JAR archive's META-INF directory.

The given closure is executed to configure a `CopySpec`. The `CopySpec` is passed to the closure as its delegate.

#### `CopySpec` `metaInf`(``Action`<? super `CopySpec`>` configureAction)

Note: This method is incubating and may change in a future version of Gradle.

Adds content to this JAR archive's META-INF directory.

The given action is executed to configure a `CopySpec`.

#### `AbstractCopyTask` `rename`(`Closure` closure)

Renames a source file. The closure will be called with a single parameter, the name of the file. The closure should return a String object with a new target name. The closure may return null, in which case the original name will be used.

#### `AbstractCopyTask` `rename`(`String` sourceRegEx, `String` replaceWith)

Renames files based on a regular expression. Uses java.util.regex type of regular expressions. Note that the replace string should use the '$1' syntax to refer to capture groups in the source regular expression. Files that do not match the source regular expression will be copied with the original name.

Example:

    rename '(.*)_OEM_BLUE_(.*)', '$1$2'

would map the file 'style_OEM_BLUE_.css' to 'style.css'

#### `AbstractCopyTask` `rename`(`Pattern` sourceRegEx, `String` replaceWith)

Renames files based on a regular expression. See `CopyProcessingSpec.rename(java.lang.String, java.lang.String)`.

#### `AbstractCopyTask` `rename`(``Transformer`<`String`, `String`>` renamer)

Renames a source file. The function will be called with a single parameter, the name of the file. The function should return a new target name. The function may return null, in which case the original name will be used.

#### `CopySpec` `webInf`(`Closure` configureClosure)

Adds some content to the `WEB-INF` directory for this WAR archive.

The given closure is executed to configure a `CopySpec`. The `CopySpec` is passed to the closure as its delegate.

#### `CopySpec` `webInf`(``Action`<? super `CopySpec`>` configureAction)

Adds some content to the `WEB-INF` directory for this WAR archive.

The given action is executed to configure a `CopySpec`.

#### `CopySpec` `with`(``CopySpec`...` sourceSpecs)

Adds the given specs as a child of this spec.

    def contentSpec = copySpec {
      from("content") {
        include "**/*.txt"
      }
    }

    task copy(type: Copy) {
      into "$buildDir/copy"
      with contentSpec
    }