NoClassDefFoundError внутри jar

У меня есть класс, который находится в пакете com.toptur.sysTray, все, что он делает, - это загружает системный трей, он не использует никаких внешних пакетов. я создаю объект SysTray для установки панели задач. Все строится нормально. я могу запустить приложение из командной строки, и системный лоток будет установлен. Но когда я пытаюсь создать банку из файлов классов и запустить ее, я получаю NoClassDefFoundError.

Пакет и его файлы классов находятся в банке, мое приложение не использует внешние банки Ant. просто классы, проверенные java.

И если собрать файл .exe из jar, он снова начнет работать без ошибок.

Как я могу это отследить?

  <target name="jar" depends="">
  <jar destfile="build/toptur.jar" > 
    <manifest>
      <attribute name="Built-By" value="Toptur"/>
      <attribute name="Main-Class" value="gotacan"/>
    </manifest>
    <fileset dir="build">
       <include name="**/*.class"/>
    <include name="**/*.png"/>
<exclude name="**/*.jar"/>
  </fileset>
</jar>

i create the jar file from a ant target using above code. driver program is not in a package. its located in gotacan.java

Я запускаю его с помощью java -jar toptur.jar

остальная часть программы работает, она выдает исключение только тогда, когда я пытаюсь использовать этот пакет.


person Community    schedule 06.06.2009    source источник
comment
Как вы создаете свой jar-файл и как его запускать?   -  person kgiannakakis    schedule 06.06.2009
comment
Можете ли вы показать всю трассировку стека NoClassDefFound?   -  person Michael Myers    schedule 06.06.2009
comment
действительно ли ваш класс назван gotacan с маленькой буквы в нижнем регистре?   -  person Billy    schedule 06.06.2009
comment
Удаление моего ответа, чтобы он появился в списке неотвеченных вопросов.   -  person Michael Myers    schedule 08.06.2009
comment
Хм, это тоже может быть из-за написания имен путей. у вас могут быть заглавные буквы в пути, но только строчные буквы в имени пакета. В Windows это, вероятно, все еще работает, но может выйти из строя, когда материал будет упакован в банку.   -  person Jens Schauder    schedule 06.07.2011


Ответы (4)


Исключение Class not Found Exception должно упоминать имя класса, который он ищет.

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

  • файл класса находится не там, где он принадлежит, когда муравей создает пакет
  • структура каталогов, представляющая имя пакета, не коренится там, где укоренены все другие классы
  • место, которому принадлежит файл класса, не входит в список файлов, которые муравей помещает в jar.

Удачи

Примечание: jar-файлы - это просто zip-файлы с определенным отношением, поэтому вы можете использовать любую zip-программу, чтобы проверить, какие файлы на самом деле там.

person Jens Schauder    schedule 06.06.2009
comment
Он также может просто использовать jar xvf toptur.jar из командной строки для извлечения jar. - person Daniel Nesbitt; 06.06.2009
comment
true (при условии, что параметры верны), но немногие знают это наизусть, в то время как почти каждый разработчик знает, что нужно использовать хотя бы один zip-инструмент - person Jens Schauder; 06.06.2009
comment
Также обратите внимание, что один класс может генерировать несколько файлов .class в зависимости от состава класса. - person Error 454; 05.07.2011

Я предполагаю, что в вашем манифесте либо отсутствует обозначение основного класса, либо путь к классам, либо в банке неправильно указан путь к каталогу пакета.

Может помочь руководство. Ваше звучит достаточно просто, когда вы упускаете из виду мелочь.

ОБНОВЛЕНИЕ: имя основного класса должно быть полностью разрешенным именем класса, включая полный пакет. Если ваш класс находится в пакете, вы ошиблись.

person duffymo    schedule 06.06.2009
comment
основной кассой нет в упаковке. остальные компоненты есть. все остальные классы разрешены нормально, кроме этого единственного. все пакеты находятся в папке com.toptur - person ; 06.06.2009

Вероятно, это зависит от JRE, с которой вы запускаете программу против JVM, которую вы используете для сборки и сборки .exe.

Функциональность SysTray довольно новая (Java6), поэтому, если у вас есть старая JRE или JVM на системном пути при запуске

java -jar toptur.jar

Он может найти класс, который вы написали, но не классы, которые он использует из JRE.

person Maarten Winkels    schedule 06.06.2009

У меня была аналогичная проблема, когда я пытался создать банку с помощью ant для проекта с открытым исходным кодом.

Я связался с авторами, и они вместо этого использовали eclipse для экспорта банки. Я повторил то, что они предлагали, и обнаружил явную разницу в размере файлов jar. Я не тратил время на определение разницы, из-за которой один работал, а другой - нет. Однако вы можете использовать аналогичный процесс, чтобы ваши вещи работали должным образом. Если да, то, возможно, вы сможете увидеть разницу и поделиться с нами результатом :)

Ниже приводится ссылка на мою проблему и решение: Xerces-for-Android NoClassDefFoundError при использовании Jar вместо исходного кода

person James Oravec    schedule 19.09.2013