Вы должны быть осторожны, используя <loadproperties>
в манифесте: хотя он работает с короткими значениями, он завершается ошибкой, когда длина строки превышает 70 символов из-за нечетного способа переноса записей манифеста.Полученные значения усекаются.
Я написал <scriptdef>
, который делает то, что вы просите, хотя он еще не полностью протестирован.
<!--
Loads entries from a manifest file.
@jar The jar from where to read
@file A manifest file to read
@prefix A prefix to prepend
@section The name of the manifest section to load
-->
<scriptdef name="loadmf" language="javascript" loaderRef="sharedbuild-loaderRef">
<attribute name="jar" />
<attribute name="file" />
<attribute name="prefix" />
<attribute name="section" />
<![CDATA[
var jarname = attributes.get("jar");
var filename = attributes.get("file");
if (jarname != null && filename != null) {
self.fail("Only one of jar or file is required");
}
var prefix = attributes.get("prefix");
if (prefix == null) {
prefix = "";
}
var section = attributes.get("section");
var manifest;
if (jarname != null) {
var jarfile = new java.util.jar.JarFile(new java.io.File(jarname));
manifest = jarfile.getManifest();
} else if (filename != null) {
manifest = new java.util.jar.Manifest(new java.io.FileInputStream(new java.io.File(filename)));
} else {
self.fail("One of jar or file is required");
}
if (manifest == null) {
self.log("No manifest in " + jar);
} else {
var attributes = (section == null) ? manifest.getMainAttributes() : manifest.getAttributes(section);
if (attributes != null) {
var iter = attributes.entrySet().iterator();
while (iter.hasNext()) {
var entry = iter.next();
project.setProperty(prefix + entry.getKey(), entry.getValue());
}
}
}
]]>
</scriptdef>
Я уверен, что JavaScript можно улучшить --Я не эксперт, но мне кажется, что он работает достаточно хорошо (запускаю тесты AntUnit, чтобы убедиться, что мои манифесты OSGi созданы правильно.) В качестве дополнительного бонуса он загружается из файла jar (или ear или war)или автономный файл манифеста.