如何使用Gradle的Manifest API将`MANIFEST.MF`文件插入zip文件的根目录

Tim*_*her 5 manifest gradle

我们使用manifestjava插件的属性将MANIFEST.MF文件写入我们的jar工件.

我们还使用gradle来构建GWT项目,我们为这些项目定义的输出是zip.我想MANIFEST.MF在该zip文件的根目录中包含一个文件.

我已经尝试过使用任务,type: Jar所以我可以使用它的manifest属性,但问题当然是清单文件被写入META-INF/MANIFEST.MF,我不想要.原因是我们将存档解压缩到主应用程序中,我需要能够MANIFEST.MF在运行时引用该文件以用于我自己的恶意目的.

所以现在档案看起来像这样:

/gwtdirectory/
/gwtdirectory/file1
/gwtdirectory/file2
/gwtdirectory/...
/gwtdirectory/filen
Run Code Online (Sandbox Code Playgroud)

我需要它像这样:

/gwtdirectory/
/gwtdirectory/MANIFEST.MF
/gwtdirectory/file1
/gwtdirectory/file2
/gwtdirectory/...
/gwtdirectory/filen
Run Code Online (Sandbox Code Playgroud)

我已经成功地让它看起来像:

/gwtdirectory/
/gwtdirectory/META-INF/MANIFEST.MF
/gwtdirectory/file1
/gwtdirectory/file2
/gwtdirectory/...
/gwtdirectory/filen
Run Code Online (Sandbox Code Playgroud)

通过如下定义:

task pack(type: Jar){
  manifest {
    attributes(...)
  }
  extension = 'zip'
  from gwt.destinationDir
}
Run Code Online (Sandbox Code Playgroud)

writeTo方法看起来很有希望,除了我找不到我可以使用的那个接口的实现,我试图避免编写自己的.

思考?

c_m*_*ker 3

查看Jar 任务,清单文件的位置似乎不可配置。

您可能想要使用 gradle 自己的DefaultManifest实现来创建清单,然后将此文件包含from在您的 zip 文件中。

你可以试试这个:

import org.gradle.api.java.archives.internal.DefaultManifest
import org.gradle.api.internal.file.IdentityFileResolver

File manifestFile = file('build/myAwesomeManifest.mf')

task generateManifest << {
   manifest = new DefaultManifest(new IdentityFileResolver())

   // add some attributes
   manifest.attributes(["attr1":"value1", "attr2":"value2"])

   // write it to a file
   manifest.writeTo(manifestFile)
}
Run Code Online (Sandbox Code Playgroud)