NoClassDefFoundError внутри фляги - PullRequest
4 голосов
/ 06 июня 2009

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

Пакет и его файлы классов находятся в jar, мое приложение не использует ant jar external. просто классы, предоставляемые Java.

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

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

  <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>

Я создаю JAR-файл из муравьиной цели, используя приведенный выше код. Драйвер программы отсутствует в пакете. находится в gotacan.java

Я запускаю его, используя java -jar toptur.jar

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

Ответы [ 4 ]

3 голосов
/ 06 июня 2009

Исключение «Класс не найден» должно содержать название класса, который он ищет.

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

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

Удачи

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

1 голос
/ 06 июня 2009

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

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

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

0 голосов
/ 19 сентября 2013

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

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

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

0 голосов
/ 06 июня 2009

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

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

java -jar toptur.jar

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

...