我正试图开发一个Ant macrodef,它在作为参数传递的清单文件中通过Require-Bundle
属性的逗号分隔值。我想要得到的是这样的东西:
Require-Bundle=org.eclipse.ui,org.eclipse.ui.ide,org.eclipse.ui.views
…
我在代码中面临的问题是,它没有考虑到如果属性在多行中有多个值,这是我的代码:
<macrodef name="getDependencies">
<attribute name="file" />
<attribute name="prefix" default="ant-mf." />
<sequential>
<loadproperties>
<file file="@{file}" />
<filterchain>
<linecontains>
<contains value="Require-Bundle" />
</linecontains>
<prefixlines prefix="@{prefix}" />
</filterchain>
</loadproperties>
</sequential>
</macrodef>
但是我得到的是:
[echoproperties] ant-mf.Require-Bundle=org.eclipse.ui,
您的Manifest文件很可能是这样的:
Require-Bundle: org.eclipse.ui,
org.eclipse.ui.ide,
org.eclipse.ui.views,
...
不幸的是,Java Manifest文件并不完全是Java属性文件。清单文件可以具有跨多行的属性,而属性文件不能具有多行值。<loadproperties>
任务不能处理多行属性
相反,你需要一个知道Manifest文件的Ant任务。在另一个问题中,Richard Steele提供了从Jar文件加载Manifest文件的Ant脚本。您可以调整该示例,使其仅获得Require-Bundle
属性。
感谢Chad Nouis,我已经将macrodef方法更改为scriptdef。我已经调试和改编了Richard Steele脚本以满足我的需要:
<!--
Loads entries from a manifest file.
@manifest A manifest file to read
@entry The name of the manifest entry to load (optional)
@prefix A prefix to prepend (optional)
-->
<scriptdef name="getDependencies" language="javascript" description="Gets all entries or a specified one of a manifest file">
<attribute name="manifest" />
<attribute name="entry" />
<attribute name="prefix" />
<![CDATA[
var filename = attributes.get("manifest");
var entry = attributes.get("entry");
if (entry == null) {
entry = "";
}
var prefix = attributes.get("prefix");
if (prefix == null) {
prefix = "";
}
var manifest;
if (filename != null) {
manifest = new java.util.jar.Manifest(new java.io.FileInputStream(new java.io.File(filename)));
} else {
self.fail("File is required");
}
if (manifest == null) {
self.log("Problem loading the Manifest");
} else {
var attributes = manifest.getMainAttributes();
if (attributes != null) {
if (entry != "") {
project.setProperty(prefix + entry, attributes.getValue(entry));
} else {
var it = attributes.keySet().iterator();
while (it.hasNext()) {
var key = it.next();
project.setProperty(prefix + key, attributes.getValue(key));
}
}
}
}
]]>
</scriptdef>