A : java bin/Osztalynev : nem működik.
2011-10-22T12:48:14+02:00
2011-10-23T11:25:45+02:00
2022-07-19T10:15:47+02:00
silver33
Sziasztok !

Parancssorból futtatnék egy osztályt.Linux op.rendszert használok, Ubuntut.
Ez a módszer működik :
java Osztalynev

De ezek nem :
java bin/Osztalynev java ./bin/Osztalynev

Mit kéne beállítanom hogy működjön ?
Hibaüzenet :

Exception in thread "main" java.lang.NoClassDefFoundError: bin/Start (wrong name: Start)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: bin/Start. Program will exit.

Mutasd a teljes hozzászólást!
Kipróbáltam én is (igaz, Windows-ban), ott sem megy. Lehet, hogy ilyen feature nincs is. Viszont megy a következő:

(cd bin; zip Start.zip Start.class) # vagy hasonló, lényeg, hogy beletegye a Start.zip-be java -cp bin Start
Mutasd a teljes hozzászólást!

  • Pontosan ezeket próbáld ki:

    (cd bin; java Start) (cd bin; java ./Start) java bin/Start
    Mutasd a teljes hozzászólást!
  • java Start
    működik,

    a többi sajnos nem működik.
    Mutasd a teljes hozzászólást!
  • Kipróbáltam én is (igaz, Windows-ban), ott sem megy. Lehet, hogy ilyen feature nincs is. Viszont megy a következő:

    (cd bin; zip Start.zip Start.class) # vagy hasonló, lényeg, hogy beletegye a Start.zip-be java -cp bin Start
    Mutasd a teljes hozzászólást!
  • Ez furcsa, elvileg működnie kellene ennek :
    java bin/Start
    .
    A te módszeredet nézve, miért kell egy .zip ? A
    java -cp bin Start
    A classpathoz adja a bin/Start útvonalat. De ott osztályt vár a "java" amikor futtatnám nem .zip-et .
    Javíts ki ha tévedek.

    Tudod az a célom, hogy shell scriptben elhelyezve a parancsot a szkript indításával tudjam futtatni az osztályt. De a script a bin fölött helyezkedik el. Majd később a .jar fölött. Olyan progit szeretnék írni amit ha valaki letölt, akkor tudja futtatni linux és windows alatt is, persze ehhez két külön projectet csinálok.
    Mutasd a teljes hozzászólást!
  • Azért kell .zip, mert a -cp (=classpath) opció hatására csak .zip és .jar fájlokat keres a megadott könyvtár(ak)ban, .class-t nem.
    Mutasd a teljes hozzászólást!
  • Ha ezt a programot sokszor futtatom - ezzel a módszerrel - akkor
    a classpathoz annyiszor hozzáadja ezt az útvonalat ? Nem lesz az sok sor a cp-ben ?
    Vagy ha már egyszer hozzáadta, akkor a továbbiakban csak felülírja ?
    Vagy ha beállítottad a classpathba ezt az útvonalat, akkor a gép kikapcsolása után ezt elfelejti ?
    Mutasd a teljes hozzászólást!
  • Amikor egy programnak (itt: java.exe vagy /usr/bin/java) megadsz egy opciót (itt: -cp), az csak az aktuális programfutásra vonatkozik, nem tárolja el sehol.
    Mutasd a teljes hozzászólást!
  • Óoh, köszönöm ! Ez ismét hasznos információ volt.
    Mutasd a teljes hozzászólást!
  • Azért nem megy, mert a két parancs mást jelent. A java parancs paramétere nem elérési út, hanem teljesen minősített osztálynév. A "bin/Osztalynev" osztály pedig nyilván más, mint az "Osztalynev" osztály. (Mondjuk nem is biztos, hogy a perjelet elfogadja osztálynévben. A hivatalos megnevezése bin.Osztalynev lenne a bin csomagban levő Osztalynev osztálynak, de néha a perjelet átfordítja magától ponttá.) Azt, hogy hol keresse az osztályokat, a classpath mondja meg, a classpath-t pedig a CLASSPATH környezeti változóval vagy a -cp paraméterrel tudod neki megadni.

    @NevemTeve:
    Azért kell .zip, mert a -cp (=classpath) opció hatására csak .zip és .jar fájlokat keres a megadott könyvtár(ak)ban, .class-t nem.


    Ne haragudj, de ezt honnan vetted? A classpath-ban könyvtárak illetve jar/zip fájlok elérési útja szerepelhet. A megadott könyvtárakban illetve jar/zip fájlokban keres aztán .class fájlokat. Olyan lehetőség nincs, hogy a megadott könyvtárban keressen zipet/jart, és aztán ezekben keressen .class-ot.

    A
    java -cp bin Start
    a "bin" könyvtárat rakja rá a classpath-ra, tehát a zipelési lépés felesleges. (Ha a zipet szeretted volna a classpath-ra rakni, akkor ezt kellett volna:
    java -cp bin/Start.zip Start
    )
    Mutasd a teljes hozzászólást!
  • Igazad van, teszteltem, nem a zip-et futtatja, tehát azt tényleg felesleges megcsinálni. (A parancs maga marad "java -cp bin Start")
    Mutasd a teljes hozzászólást!
  • Szia ! Köszi a válaszokat neked is !

    A
    java -cp bin Start
    a "bin" könyvtárat rakja rá a classpath-ra, tehát a zipelési lépés felesleges. (Ha a zipet szeretted volna a classpath-ra rakni, akkor ezt kellett volna:
    java -cp bin/Start.zip Start
    )

    A "Start"-ot miért kell a parancs végére írni ?
    java -cp bin : gondolom ez azt jelenti, hogy a cp-hez hozzáadja a bin könyvtárat és így az alatta szereplő összes osztályt.

    java -cp bin/Start.zip : pedig a Start.zip-ben szereplő összes osztályt.

    Ha a parancsok végén ott van az osztálynév - Start - akkor csak azt az egy osztályt éri el ezen az útvonalon ?

    És miért nem így kell megadni ? :
    java -cp bin/Start
    Mutasd a teljes hozzászólást!
  • Az utolsó paraméter az indítóosztály neve. Ebben az osztályban kell lennie egy ilyen metódusnak:
    public static void main(String[] args);
    Ez a metódus fogja megkapni a vezérlést a program indulásakor. Ha nincs meg a megadott indítóosztály, vagy nincs rajta ilyen metódus, az hibajelzést okoz, és kilép a virtuális gép.

    Azért kell megadni ezt az osztályt, mert egyrészt drága lenne a classpath-t végigszkennelni main metódusok után kutatva, másrészt több, ilyen metódust tartalmazó osztály is létezhet. Sokkal tisztább, ha meg kell adni az indítóosztály nevét, és kezdetben csak az töltődik be. (A többi osztály csak akkor töltődik be, amikor először szükség van belőle valamire.)

    A classpath azt adja meg, hogy úgy általában hol lehet osztályokat találni. Nincs közvetlenül köze az indítóosztályhoz, csak ugye az indítóosztályt is ugyanúgy keresi meg a virtuális gép, mint az összes többit.
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a válaszokat !
    Mutasd a teljes hozzászólást!
  • Még egy dolog eszembe jutott. Ha nem .zip-et vagy .jar-t teszek a classpatra hanem osztályt akkor az utolsó paraméter elhagyható ? Itt most az indítóosztály nevére gondolok. Tehát a
    bin
    könyvtár alatt csak a Start.class osztályt szeretném megadni a classpath-ba. Így :
    java -cp bin/Start.class

    a bin könyvtár fölött állok éppen.
    És ezután a beállítás után
    java Start
    paranccsal futtathatom a Start.class-t bárhol álljak a könyvtárhierarchiában akár feljebb akár lejjebb a Start.class-osztálytól nézve bárhol ?
    Mutasd a teljes hozzászólást!
  • Előző kérdésem lehet hogy butaságot is tartalmaz, azóta kipróbáltam pár dolgot.
    Tehát Ubuntu op. rendszeren nekem így sikerült futtatni a Start.class-t úgy , hogy nem abban a könyvtárban állok ahol a Start.class van :
    java -cp ./bin/Start.zip Start
    Ez is jó:
    java -cp bin/Start.zip Start
    De ezek nem jó megoldások :
    java -cp bin/Start.zip java -cp bin/Start
    Tehát mégiscsak kell .zip vagy .jar file, ha a
    java -cp
    paranccsal szeretné futtatni az ember a java programját.
    Lehet hogy van olyan megoldás is amikor nem kell és elég a .class-t megadni a parancsban valahogy, csak én azt nem tudom.
    Mutasd a teljes hozzászólást!
  • A java parancs kötelező paramétere az, hogy mit indítson; ezen nem változtat az, hogy kapott-e ilyen vagy olyan opciókat.

    PS: Elnézést kérek, amiért ezt a .zip-et feleslegesen belekevertem -- de még az is hasznos lehet, ha egy több class-os projektet akarsz egy fájlban tartani.
    Mutasd a teljes hozzászólást!
  • Aha értem. De a start.class-t nem sikerült úgy futtatnom, hogy
    java -cp -nek megadtam az elérési útvonalát, csak a .zip-es módszerrel sikerült futtatni.
    Egy shell scriptbe beleraktam ezt :
    #!/bin/bash java -cp ./bin/Start.zip Start
    így végül is fut.
    Mutasd a teljes hozzászólást!
  • Úgy látom, nem sikerült elég világosan elmagyaráznom.

    A classpath olyan helyek listája (könyvtárak és zip/jar) fájlok, ahol osztályokat kereshet a virtuális gép. A classpath-on közvetlenül class fájlt nem lehet megadni. Ez már csak azért is így van, mert a classpath elemei alatt általában még extra könyvtárak vannak, a class fájlok nagyon ritkán vannak közvetlenül a megadott könyvtáraban.

    A Java nyelv ajánlása az, hogy az osztályaidat csomagokba rendezd, ahol a csomagnév a domain neved megfordított változatával kezdődik. Tehát ha mondjuk az enyém lenne a "csaboka.example.com" domain, akkor a csomagjaim nevének "com.example.csaboka"-val illik kezdődnie. Tegyük fel, írtam egy kódot, és az indítóosztályom a com.example.csaboka.myapp.Stuff. Kiadom ezt a parancsot a futtatásához:
    java -cp ~/mystuff/myapp:~/mystuff/myjar.jar com.example.csaboka.myapp.Stuff

    A Java látja, hogy a com.example.csaboka.myapp.Stuff osztályt kell betöltenie a futtatáshoz. Végigmegy a classpath-on, és ezeket próbálja sorban:
    * ha a ~/mystuff/myapp/com/example/csaboka/myapp/Stuff.class fájl létezik, betöltjük és kész vagyunk
    * ha a ~/mystuff/myjar.jar létezik, és érvényes zip fájl, akkor megnyitjuk, és keresünk benne egy fájlt com/example/csaboka/myapp/Stuff.class elérési úttal. Ha van ilyen, betöltjük és kész vagyunk.
    * vége a classpath-nak, és nincs meg a fájl, hibát adunk.

    Ha helyette ezt próbáltam volna:
    java -cp ~/mystuff/myapp/com/example/csaboka/myapp:~/mystuff/myjar.jar Stuff
    akkor hibát kapok. Ez azért van, mert van ugyan a classpath-on egy Stuff.class, de amikor belenéz a Java, látja, hogy ennek a classnak a neve "com.example.csaboka.myapp.Stuff", ő pedig éppen "Stuff"-ot keres, így ez nem felel meg neki.

    Szóval két dolog van:
    1. A classpath-nak tartalmaznia kell a könyvtárat vagy zip fájlt, amiben az osztályod van. Magát a class fájlt rárakni nincs értelme.
    2. Mindenképp meg kell adnod az osztályt (és nem a fájlnevet), amit indítani szeretnél. Ezt az osztályt a classpath-on fogja keresni a Java, pont, mint az összes többit.
    Mutasd a teljes hozzászólást!
  • Hú, köszi ! Ez nem semmi ! Látom te ezt érted is és nagyon megy neked.
    Mutasd a teljes hozzászólást!
  • Remélem nem lesz sértődés abból , hogy NevemTevének adtam a pontot.
    Mutasd a teljes hozzászólást!
abcd