[Megoldva] java.lang.ClassNotFoundException: org.apache.fop.tools.DocumentInputSource

Fórumok

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!

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

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?

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.

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!