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

时间:2012-01-23 15:00:27

标签: manifest gradle

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

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

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

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

/gwtdirectory/
/gwtdirectory/file1
/gwtdirectory/file2
/gwtdirectory/...
/gwtdirectory/filen

我需要这样做:

/gwtdirectory/
/gwtdirectory/MANIFEST.MF
/gwtdirectory/file1
/gwtdirectory/file2
/gwtdirectory/...
/gwtdirectory/filen

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

/gwtdirectory/
/gwtdirectory/META-INF/MANIFEST.MF
/gwtdirectory/file1
/gwtdirectory/file2
/gwtdirectory/...
/gwtdirectory/filen

通过如下定义:

task pack(type: Jar){
  manifest {
    attributes(...)
  }
  extension = 'zip'
  from gwt.destinationDir
}

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

思想?

2 个答案:

答案 0 :(得分:3)

查看Jar task,看起来清单文件的位置不可配置。

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

你可以试试这个:

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

答案 1 :(得分:2)

我认为在Gradle手册的this chapter末尾正是您正在寻找的内容。

jar.manifest.writeTo("$buildDir/mymanifest.mf")