Проблемы с путем к классам Java Manifest.mf
-
22-07-2019 - |
Вопрос
Я пытался запустить файл jar (назовем его test.jar), который использует Sybase jconn3.jar в системе Unix.
Я создал файл MANIFEST.MF, который имеет следующее:
Class-Path: $SYBASE/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar
Это дает ClassNotFoundError.$SYBASE — системная переменная, указывающая на /opt/sybase13;Я также попробовал следующее:
Class-Path: /opt/sybase13/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar
и
Class-Path: opt/sybase13/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar
Однако, если я скопирую файл jconn3.jar из $SYBASE/jConnect-6_0/classes в тот же каталог, что и test.jar, и обновлю свой MANIFEST.MF следующим образом:
Class-Path: jconn3.jar commons-net-1.3.0.jar
Приложение работает как положено.
Теперь я смог убедиться, что файл jconn3.jar работает, скопировав его локально;мой файл MANIFEST.MF включает путь к моему основному классу, так что здесь это не проблема.
Как вы думаете, в чем может быть проблема?Я слишком долго смотрю на эту вещь.Спасибо!
Решение
Записи в пути к классам либо относятся к JAR-файлу, в который они встроены (с которым вы работаете), либо являются URL-адресами.Чтобы ваши абсолютные пути работали, вам необходимо преобразовать их в URL-адреса, например:
file:/opt/sybase13/...
Нет механизма использования переменных.
Хотя спецификация JAR не говорит об этом ясно, абсолютно file:
URL-адреса схемы работают в атрибуте class-path.
Другие советы
Переменные среды не считываются загрузчиком классов AFAIK.Однако вы можете добавить банку в скрипт конфигурации.
Согласно спецификации, записи являются родственниками jar, а не абсолютными:
Путь к классу:
Значение этого атрибута указывает относительные URL-адреса расширений или библиотек, которые необходимы этому приложению или расширению.URL-адреса разделяются одним или несколькими пробелами.Загрузчик классов приложения или расширения использует значение этого атрибута для построения своего внутреннего пути поиска.
http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html #Спецификация манифеста