Я получаю исключение "не найдено определение класса" при попытке запустить мое приложение в Windows (оно нормально работает в OS X). Классы, на которые жалуется JVM, являются моими классами (сторонние банки не требуются). Когда я распаковываю файлы внутри фляги, присутствуют все файлы, включая те, на которые жалуется JVMm.
Баночка создается с помощью следующей задачи:
<target name="jar" depends="">
<jar destfile="build/app.jar" >
<manifest>
<attribute name="Built-By" value="hamza"/>
<attribute name="Main-Class" value="com.hamza.driver.ui"/>
<attribute name="Class-Path" value="./"/>
</manifest>
<fileset dir="build">
<include name="**/*.class"/>
<include name="**/*.png"/>
<include name="**/*.xpi"/>
<include name="**/*.html"/>
<exclude name="**/*.jar"/>
</fileset>
</jar>
Я не могу понять, в чем причина проблемы. Если я разархивирую банку и запускаю банку из каталога, в который разархивировал класс, все работает нормально. Итак, я предполагаю, что все необходимые файлы находятся внутри банки.
EDIT: com.hamza.driver.ui
- это класс в пакете с именем com.hamza.driver
, который имеет main
.
После сборки я получаю один jar "app.jar" и запускаю его, используя "java -jar app.jar", который отлично работает в OS X, но не в Windows.
Если я разархивирую app.jar
в отдельном каталоге и запускаю «java -jar app.jar», это оправдывает себя.
РЕДАКТИРОВАТЬ 2: исключение:
Exception in thread "main" java.lang.NoClassDefFoundError: com/hamza/gui/tr
ansfer/ClipboardTransferHandle
at com.hamza.driver.ui.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.hamza.gui.transfer.Clipboa
rdTransferHandle
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 1 more
Файлы ClipboardTransferHandle .class присутствуют в банке.
РЕДАКТИРОВАТЬ 3: импорт для класса буфера обмена:
import java.util.logging.Logger;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.IOException;
Во время игры с ним я обнаружил, что если я пытаюсь объявить ClipboardTransferHandle
как статическую переменную в драйвере, она работает, но каждый объект, который не является статическим, не найден.
Все основные элементы GUI являются статическими переменными, поэтому GUI построен, а другие элементы нет; все, что создано не статично, вызывает NoClassDefFound
, но если я объявлю их статичными для тестирования, они будут работать.