我正在尝试开发一个Ant macrodef,它获取在作为参数传递的Manifest文件中以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,
任何帮助将不胜感激。
答案 0 :(得分:1)
最有可能的是,您的清单文件如下所示:
Require-Bundle: org.eclipse.ui,
org.eclipse.ui.ide,
org.eclipse.ui.views,
...
不幸的是,Java Manifest文件并不是Java Properties文件。清单文件可以具有跨越多行的属性,而属性文件不能具有多行值。 <loadproperties>
任务无法处理多行属性。
相反,您需要一个了解Manifest文件的Ant任务。在另一个问题中,Richard Steele provides Ant script从Jar文件加载Manifest文件。您可以调整示例以仅获取Require-Bundle
属性。
答案 1 :(得分:1)
感谢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>