Подтвердить что ты не робот

Исполняемый JAR игнорирует свой собственный атрибут Class-Path

Я использовал инструкции, найденные в Maven - как я могу добавить произвольную запись пути к Class-Path в банку, чтобы добавить произвольную запись в атрибут Class-Path. Вот мой файл MANIFEST.MF:

Manifest-Version: 1.0
Class-Path: jace-runtime.jar
Main-Class: org.jace.examples.Test

Я определил org.jace.examples.Test следующим образом:

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("classpath: " + System.getProperty("java.class.path"));
        System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook"));
    }
}

где org.jace.util.ShutdownHook определяется в jace-runtime.jar. Когда я java -jar peer_example1.jar я получаю следующий вывод:

classpath: peer_example1.jar Исключение в потоке "main" java.lang.ClassNotFoundException: org.jace.util.ShutdownHook

Другими словами, Java добавляет исполняемый файл JAR в Class-Path к классам, но игнорирует Class-Path к классам. Если я java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test я получаю ожидаемый результат:

classpath: jace-runtime.jar;peer_example1.jar

Есть идеи?

4b9b3361

Ответ 1

Отвечая на мой собственный вопрос:

  • Добавление произвольных записей в Class-Path в порядке. Проблема возникает, когда вы включаете индексирование JAR с помощью:

    <configuration>
      <archive>
        <index>true</index>
      </archive>
    </configuration>
    

    Maven будет опускать ваши записи из META-INF/INDEX.LIST.

  • Когда вы используете JAR во время выполнения, Java будет искать INDEX.LIST для поиска классов, а не MANIFEST.MF.

  • Поскольку ваши записи отсутствуют в INDEX.LIST, они не будут найдены загрузчиком классов, независимо от того, что говорит манифест.

Простым обходным путем является отключить индексирование JAR. Я не уверен, как ввести произвольное Class-Path с индексированием.

Ответ 2

Для тех, кто в противном случае может не знать, механизм исполняемого архива принимает путь класса manifest и использует его для загрузки классов external в архив.

Итак, если вы ожидаете WAR с явным классом классов WEB-INF/classes, чтобы найти классы в записи WEB-INF/classes внутри, тогда вы будете разочарованы.

Ответ 3

На странице tooldocs для опции jar - Ссылка на документы

Когда вы используете этот параметр, JAR файл является источником всех пользовательских классов, а другие параметры пути к пользовательскому классу игнорируются.