Проблемы с classpath с Jini ClassDep, искателем зависимостей Java
Я начал использовать Sun ClassDep в качестве решения для борьбы с включением ненужных JAR-файлов в мое получившееся приложение WAR. Кажется, рок. Однако этого зверя трудно приручить!
Я получаю несколько ошибок классов, не найденных, даже если они явно включены в путь к классу, который я передаю ему. Пример:
не удалось найти: org.apache.log4j.Logger: Нет файла для: Logger Не удалось найти: org.hibernate.Session: Нет файла для: Session Не удалось найти: org.joda.time.LocalDate: Нет файла для: LocalDate
ОДНАКО... Зацените часть пути к классу, который я даю:
...;"C:\Documents and Settings\Andre\Desktop\workspace\icaro\WebContent\WEB-INF\lib\hibernate3.jar";...;"C:\Documents and Settings\Andre\Desktop\workspace\icaro\WebContent\WEB-INF\lib\joda-time-1.5.2.jar";"C:\Documents and Settings\Andre\Desktop\workspace\icaro\WebContent\WEB-INF\lib\log4j-1.2.11.jar";...
Я просмотрел их и увидел, что "недостающие" классы действительно находятся в этих файлах.
Кто-нибудь есть идеи, что дает?
3 ответа
Я вижу, вы работаете на окнах. Не могли бы вы столкнуться с печально известным исключением "Входная строка слишком длинная"?
Возможно, ваш Classpath слишком длинный, если вы включаете большое количество jar-файлов.
В этом посте Хунг Хуинх (Terracotta) есть лучшее объяснение этой проблемы и несколько вариантов того, как вы можете справиться с ней, если это ваша проблема.
Эти записи, вероятно, находятся в файлах манифеста одного или нескольких JARS, на которые вы ссылаетесь. Classdep игнорирует записи в файлах манифестов, что приводит к ошибкам.
Увидеть ClassDep
документация:
Если вы используете файлы JAR, любые записи манифеста Class-Path в этих файлах JAR игнорируются, поэтому вы должны явно включить значения этих записей манифеста в путь, иначе могут возникнуть ошибки. Например, если вы включаете jini-ext.jar, то вам также следует явно включить jini-core.jar, потому что jini-core.jar находится в записи манифеста Class-Path в jini-ext.jar.
Разве это не проблема с вашими банками? Как правило, если это проблема пути к классам, вы получите NoClassDefFoundError.
Некоторые способы исследовать это было бы
отобразить путь к классу из вашей программы (System.out.println(System.getProperty("java.class.path");
попросите загрузчик классов отобразить URL загруженного класса в различных точках вашего приложения, если вы используете иерархию загрузчиков классов (System.out.println(Thread.currentThread().getContextClassLoader().getResource( "org/apache/log4j/Logger.class");