Как мне прочитать манифест существующего jar и добавить к его пути к классам с помощью Ant

#java #ant

#java #ant

Вопрос:

Я хочу добавить цель в свой Ant-скрипт, который считывает манифест jar и добавляет новый jar в конце. Я посмотрел на loadproperties task, и он казался близким, но не мог справиться, когда путь к классу разделен на несколько строк. Итак, кто-нибудь знает, возможно ли это с помощью готовых Ant-задач?

Комментарии:

1. Возможно, было бы полезно упомянуть очевидный ответ и почему он не подходит для этой задачи.

Ответ №1:

Задача манифеста в update режиме может показаться очевидным ответом.

Комментарии:

1. Если я установлю путь к классу в задаче манифеста в режиме обновления, это перезапишет то, что уже есть. Я хочу добавить. Очевидно, что это должно произойти ПОСЛЕ того, как существующий путь к классу уже был прочитан и изменен.

Ответ №2:

Основываясь на приведенном здесь коде, я изменил его, чтобы читать в существующем пути к классам, добавить новый файл jar в конце, а затем сохранить его в свойстве. На этом этапе легко записать обратно, используя задачу манифеста.

 public void execute() throws BuildException {
    validateAttributes();

    checkFileExists();

    JarFile jarFile = null;     
    Manifest manifest = null;

    try {
        jarFile = new JarFile(directory   "/"   jar);
        manifest = jarFile.getManifest();
        Attributes attributes = manifest.getMainAttributes();
        String currClasspath = attributes.getValue("Class-Path");

        String newClasspath = currClasspath.concat(" ").concat(append);

        getProject().setProperty(propertyName, newClasspath);           
    } catch (IOException e) {
        throw new BuildException();
    } finally {
        if (manifest != null) {
            manifest = null;
        }
        if (jarFile != null) {
            try {
                jarFile.close();
            } catch (IOException e) {}
            jarFile = null;
        }

    }
}
  

Методы получения / установки / утилиты опущены для пробела. Тогда код Ant выглядит следующим образом:

 <target name="addToClasspath" depends="build">
    <property name="testPath" value="C:/"/>     

    <taskdef name="manifestAppender" classname="ClasspathAppender" />

    <manifestAppender dir="${testPath}" jar="wbclasspath.jar" append="test.jar" property="newClasspath" />

    <echo>Manifest class-path: ${newClasspath}</echo>

    <jar destfile="${testPath}/wbclasspath.jar">
        <manifest>
            <attribute name="Class-Path" value="${newClasspath}" />
        </manifest>
    </jar>      
</target>