NoClassDefFoundError с исполняемым файлом Jar - PullRequest
1 голос
/ 23 декабря 2010

Вероятно, очень обычная проблема с exec jar. Я пытаюсь создать и запустить исполняемый файл, и он сводит меня с ума.

У меня есть пара классов (с пакетом stmts), один из которых имеет метод main, простой пустой конструктор и, конечно же, несколько методов biz, которые являются частью небольшого проекта Eclipse.
Я объединяю оба эти файла и файл манифеста в jar (arc.jar), используя build.xml. Моя программа использует библиотеку jdom, а также ссылки из одного из моих других проектов eclipse, поэтому при сборке моего arc.jar я включаю как библиотеку jdom, так и другую библиотеку biz.

Это Manifest.MF, который я написал, есть новая строка после Main-Class

Manifest-Version: 1.2  
Class-Path: jdom.jar other.jar
Main-class: uk.co.Art 

Когда я распаковываю этот arc.jar, он содержит jdom.jar, other.jar, META-INF / Manifest.mf и пакет с моими классами. Как ни странно, файл манифеста в банке выглядит так -

Manifest-Version: 1.2 
Created-By: 14.2-b01 (Sun Microsystems Inc.) 
Main-class: uk.co.Art
Class-Path: jdom.jar other.jar

Я получил ClassNotFoundException ClassNotFoundException: uk.co.Art, когда значение класса Main было без пакета. С пакетом ошибка изменилась на ClassNotFoundException: org.jdom.JDOMException.
Так что просто для целей тестирования я попытался указать полный путь с c:\ как для моего исполняющего класса, так и для jar-файлов, но все равно он не может найти основной класс, ошибки ClassNotFoundException: uk.co.Art.
Кажется, я не понимаю, почему.
Используемая мной командная строка - java -jar Arc.jar
Версия в командной строке cmd -
java version "1.6.0_16"<br> Java(TM) SE Runtime Environment (build 1.6.0_16-b01)<br> Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode)
в то время как затмение установлено jre6

Что вы, ребята, можете предложить?

Решение Алекса действительно решило проблему для локального исполнения.
Я также думаю о другом способе (в качестве дополнительной опции) выполнения, чтобы развернуть Arc.jar на сервере и запустить пакет на этом компьютере, который в основном устанавливает путь к классу java, а затем вызывает либо jar, либо напрямую класс в зависимости от того, как работает. But its only an option, not a preferred one though.
Или также установите этот classpath в моем манифесте и соберите jar локально и разверните на сервере.
Хотел бы попробовать несколько вещей, хотя. But now I understand that the basic problem was jars into jar and hence classpath issue.

Большое спасибо, ребята.

Ответы [ 4 ]

6 голосов
/ 23 декабря 2010

Вы не можете связать другие JAR в JAR.Они должны находиться в той же папке или, по крайней мере, в папке, относящейся к Arc.jar.Затем вы указываете его относительный путь в записи Class-Path.

Eclipse, тем не менее, имеет полезный инструмент экспорта, который позволяет вам встраивать содержимое других JAR-файлов в ваш JAR-файл, чтобы не потерять несколько свободных элементов.JAR, которые необходимо разместить в определенном месте.Выберите опцию 2 Обработка библиотеки , если вы выберете Экспорт> Запускаемый файл JAR .

alt text

При выборе Упаковать необходимые библиотеки в сгенерированный JAR , тогда Eclipse добавит специальный загрузчик классов, который будет прозрачно загружать эти JAR-файлы перед выполнением основного класса,Это делается с помощью JarRsrcLoader.

2 голосов
/ 23 декабря 2010

Вам не нужно паковать дополнительные банки в свою банку. Эти файлы должны находиться в том же каталоге, что и ваше приложение. Другими словами: поместите все банки в один каталог и запустите. Все будет работать.

Причины: подумайте, что означает исполняемый файл jar. Если ваш jar не является «исполняемым», вы запускаете его следующим образом:

java -cp art.jar;ldom.jar;other.jar uk.co.Art

когда ваш jar исполняемый, вы используете следующую командную строку:

java -jar art.jar

Никакой магии: jvm открывает манифест и берет оттуда имя основного класса и других jar-файлов и фактически создает командную строку, подобную первой. Теперь вы понимаете, что все банки в вашем случае должны находиться в одном каталоге.

0 голосов
/ 11 апреля 2016

Просто несколько вещей, которые нужно отметить при экспорте.

  1. JRE, связанная с проектом, соответствует JRE, которая будет использоваться для его запуска.

  2. Пожалуйста, экспортируйте ваш проект на локальный диск, затем переместите его на любой общий диск (это исправило мою проблему).

Спасибо.

0 голосов
/ 23 декабря 2010

Может быть .jar испорчен, как иногда случалось со мной.Взгляните на это .

...