Вопросы относительно InvalidJarIndexException? - PullRequest
2 голосов
/ 05 августа 2010

Я просмотрел документ спецификации JAR и обнаружил, что в памяти hashtable создается файл INDEX.LST для ускорения процесса поиска файла класса.

Если кто-нибудь может ответить на мои следующие вопросы -

  1. Когда строится hashtable? Когда загружается приложение или когда приходит запрос на загрузку апплета?

  2. Поскольку все классы уже являются частью архива, почему нужно получить InvalidJarIndexException. Как индексы могут стать недействительными? например В моем случае я получаю InvalidJarIndexException, когда я использую index=true вместе с indexjars в моей сборке муравья, но я не вижу никаких исключений, когда indexjars не используются.

  3. Как мне решить проблему InvalidJarIndexException, если я хочу придерживаться индексации?

  4. Роль плагина java-браузера в загрузке jar-файлов?

Ответы [ 3 ]

0 голосов
/ 12 августа 2010

JarIndex, кажется, полезен для апплетов и работы в сети.Это может предотвратить загрузку ненужных архивов.

Здесь у нас есть так называемый root jar , который включает в себя файл INDEX.LIST, и этот файл включает в себя отображение из класса в библиотеку.Загрузчик классов прочитает файл, создаст внутреннюю хеш-таблицу и использует эту таблицу, чтобы определить, где можно найти класс.Если библиотека еще не загружена, она загрузит ее для загрузки класса.В противном случае пришлось бы загружать все библиотеки одновременно, чтобы разрешить один класс (поскольку имя класса никогда не дает подсказки, где класс можно найти)

Как только загрузчик классов находит такой индекс, он доверяет этой информациии будет жаловаться с исключением, если информация не соответствует действительности.Скажем, индекс сообщает загрузчику классов, что com.example.MyClass можно найти внутри http://example.com/a.jar, затем он загрузит (если еще не сделал) флягу и заглянет только внутрь этой библиотеки.Если такого класса нет, он будет не искать в разных банках (или даже загружать дополнительные банки), но будет иметь горб с вами (и выбрасывать исключение).

Если вы столкнетесь с такимисключение, вы можете быть довольно потеряны.Проблема (поврежденный файл INDEX.LIST) не может быть исправлена ​​на стороне потребителей.Но поскольку загрузчик классов ожидает файл INDEX.LIST в первом jar на пути к классам, изменение порядка библиотек в выражении classpath может решить такую ​​проблему, отключив функцию индексатора.


Дополнительное чтение


Рабочий пример с ant

Я создал два очень простых класса для печати Hello world:

package test;

public class Hello {
    public static void main(String[] args) {
        System.out.println(HelloTextFactory.createResponse());
    }
}

и

package test;

public class HelloTextFactory {
    public static String createResponse() {
        return "Hello world";
    }
}

и файл ant (сборка.xml) для создания архивов:

<project name="test">
    <target name="jar" description="description">
        <delete file="main.jar" />
        <delete file="factory.jar" />

        <jar destfile="factory.jar" includes="test/HelloTextFactory.class" basedir="bin" />
        <jar destfile="main.jar" includes="test/Hello.class" basedir="bin" index="true">
            <indexjars>
                <fileset dir="." id="jars">
                    <include name="factory.jar" />
                </fileset>
            </indexjars>
            <manifest>
                <attribute name="Main-Class" value="test.Hello" />
                <attribute name="Class-Path" value="factory.jar" />
            </manifest>
        </jar>
    </target>
</project>

Этот файл сборки предполагает, что классы были скомпилированы в папку bin перед запуском сценария.

При запуске сценария сборки создаются два jar-файла, main.jar содержит индекс и java -jar main.jar успешно выполняется.Затем я переместил второй класс в другой пакет и снова начал сборку.И снова, он создал рабочее приложение.

Во время экспериментов я понял, что

  • необходимо принудительно создать все банки, особенно основной сосуд.Если ant перестроит factory.jar, индекс не будет обновлен и может быть недействительным.Вот почему я добавил delete задач.
  • main.jar должен быть создан после все остальные банки созданы.
0 голосов
/ 28 марта 2013

Может ли этот фрагмент помочь вам в его расследовании:

echo -e "\n`jar -tf main.jar | sed -e '/.class/d' -e '/.properties/d' -e '/services\/./d' -e '/.res/d' -e '/NOTICE/d' -e '/LICENSE/d' -e '/MANIFEST.MF/d' -e 's/.$//'`"

или просто

jar -tf main.jar
0 голосов
/ 10 августа 2010

Я никогда не сталкивался с этой проблемой, поэтому я не боюсь, что я вам мало чем помогу, но я приложу все усилия, чтобы облегчить ситуацию.

  1. Он создается при загрузке класса: сам загрузчик класса ищет файл index.list и использует его, если он доступен.

  2. Вы можете получить это исключение, если файл index.list поврежден, потому что, если загрузчик классов нашел индексный файл, он больше не будет искать путь к классам для загрузки класса: он будет только используйте индекс. Здесь, кажется, он даже не может загрузить его, поэтому он выбрасывает InvalidJarIndexException

  3. Попробуйте вручную сгенерировать index.list с помощью инструмента jar, используя опцию -i. Если это работает, то это проблема муравья: сравните сгенерированные файлы для расследования. Если он по-прежнему не работает, проверьте файл index.list вручную (неправильная кодировка «усеченные длинные пути», пропущенные классы »).

  4. Ненужные. Процесс загрузки класса выполняется загрузчиком классов. То, как на самом деле работает файл jar, не имеет значения.

Изменить, чтобы добавить комментарий Дьявола Джина:

Индексация в ant имела ошибки ранее. Вам нужно использовать версии 1.6 или после чтобы индексирование работало. Достать банку индексируется, вы должны установить index = true наряду с указанием файлов JAR в Тег indexjars . ant.apache.org / ручной / Задачи / jar.html # indexjars

...