Sziasztok!
Nem vagyok profi jávás, épp ezért adódott egy kis problémám egy Java program futtatásával.
A program futásakor ezt az üzenetet kapom:
java.lang.ClassNotFoundException: org.apache.fop.tools.DocumentInputSource
Pedig a program gyönyörűen lefordult. Tehát a fordítás időpontjában még megtalálta a fordító a nevezett DocumentInputSource osztályt.
Ráadásul az az egészben a gyanús, hogy a programnak el sem kellene odáig jutnia, hogy használja ezt az osztályt, ugyanis a kód valahogy így néz ki, és én nem adtam meg indításkor semmilyen paramétert (két fájlnévre lenne szükség!):
import org.apache.fop.tools.DocumentInputSource;
// egyéb import
public class AClass {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("Program indítás: AClass file1 file2");
System.exit(1);
}
else {
// Valami kód egyébként!
}
}
// Egyéb függvények:
}
UBUNTU 8.04 gépem van és NetBeans 6.0.1-et használok.
A fordítást úgy végeztem, hogy a szükséges JAR fájlt megadtam a projekt "Libraries" részében. A JAR fájl a /usr/share/java könyvtárban található.
Mit kell még csinálnom, hogy ne kapjak ilyen üzenetet? Ha tudtok, segítsetek!
- 2633 megtekintés
Hozzászólások
szerintem a .class-ba belefordult ennek az org.apache. ... -nak dolga, és a jáva futtató környezet ezt nem találja, míg az IDE-be bele van téve ennek az elérhetősége. próbáld így java -cp /path/to/org/apache/....DocumentInputSource AClass
- A hozzászóláshoz be kell jelentkezni
Szia suti!
Ha úgy írom be, ahogy javasoltad, akkor viszont az AClass-t nem találja.
Ugyanaz a kivétel jelenik meg, csak így:
java.lang.ClassNotFoundException: AClass
- A hozzászóláshoz be kell jelentkezni
Ha parancssorból indítod a javát akkor az alapértelmezett classpath a ./ könyvtár. Ha megadsz valami mást akkor viszont a ./ már nem alapértelmezett, tehát hozzá kell venni. Ráadásul Windowson ";" az elválasztó, Linuxon ":".
java -cp ./:blabla AClass
Pontosan mi volt a parancssorod?
- A hozzászóláshoz be kell jelentkezni
Kulcsszó: class loading.
Amit érdemes tudni dióhéjban: egy Javas alkalmazás osztályai dinamikusan töltődnek be futásidőben, nem az indítás pillanatában; és mivel fordításnál (gondolom a NetBeans miatt) rendelkezésre áll a használt osztály, probléma nélkül lefordul. Ami ezt a betöltést (a .class fileok betöltését) elvégzi az a ClassLoader és ennek különböző leszármazottai. Minden ClassLoader rendelkezik egy (vagy több) repositoryval, ahonnan az osztályokat szedi, ez leegyszerűsítve a classpath, csak a classpathon lévő osztályokat találja így meg (ha nála nincs meg, akkor a szülő által elérhetőeket is elkérheti).
A kérdésedre a válasz: a használt osztály nincsen a classpath-odon. Parancssorból,
java -cp /itt/vannak/a/jarok MainClass
módszerrel érdemes indítani.
- A hozzászóláshoz be kell jelentkezni
Köszönöm a segítségeteket! Most már fut a program.
A következő parancssori utasítás már működött:
java -cp ./:/usr/share/java/fop.jar AClass
Tehát -cp után kettősponttal elválasztva fel kell sorolni a szükséges osztályokat tartalmazó könyvtárak neveit és a JAR fájlok elérési útvonalát (a JAR fájlok megnevezésével együtt!)
Jó éjszakát mindenkinek!
- A hozzászóláshoz be kell jelentkezni