Исполняемый 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
Есть идеи?
Ответы
Ответ 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 файл является источником всех пользовательских классов, а другие параметры пути к пользовательскому классу игнорируются.