Java Simpel ClassPath probleem met meerdere mappen?

Pagina: 1
Acties:

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Ik vind het echt een te stom idee om te vragen, maar na een paar dagen kom ik er nog niet uit.

Ik heb de volgende package (cq. directory) structuur.

Main\Main.class, Main.java
Model\Model.class, Model.java
Map3\...
Map4\...

Alle mappen hebben de naam van de packages en zijn automatisch door Netbeans gegenereerd. Het project compiled in Netbeans prima en ik kan het ook prima runnen. Ook extrern via het jar bestand gaat het allemaal prima.

Wat echter niet lukt is het simpele
java Main

en eerste kon javac niet eens gevonden worden. Na het aanpassen van mijn CLASSPATH en PATH variabele onder vista kan ik nu het hele project compilen via:
javac -classpath .. *.java en javac -classpath .. Main.java werkt ook
(dit toe ik dan beide vanuit de map Main)
maar het programma uitvoeren werkt nogsteeds niet via de cmdline. Ik krijg nog steeds de noclassdeffound error.

java Main vanuit de map Main werkt niet. en ook java -classpath .. Main vanuit de map Main werkt niet.

Het lijkt me toch dat als de compiler (javac.exe) alle bestanden en packages kan vinden dat java.exe het dan ook moet kunnen? Ze gebruiken dezelfde classpath variabelen neem ik aan dus die moeten nu toch goed staan. Ook lukt het me wel om andere java programmas via de commandline te runnen maar die maken geen gebruik van een "ingewikkelde" package /folders structuur.

Nog even de exacte foutmelding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\<censuur>\src\Main>java Main
Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: Mai
n/Main)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        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)


Edit: ik heb even een andere java programmatje geplukt van internet met meerdere directories en daar gaat het ook direct fout. terwijl de code compiled, klopt en erg simpel is en in Eclipse geimporteerd wel gewoon werkt.

[ Voor 4% gewijzigd door roy-t op 23-06-2008 10:24 ]

~ Mijn prog blog!


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Aah het werkt.

Toch nogmaals wat google termen ingevuld en nu kam ik op een andere websites waar classpaths nog duidelijker worden uitgelegd.

Ik kwam er achter dat de volgende manier wel mijn programma uitvoerd.

code:
1
C:\<censuur>\src\Main>java -classpath .. Main.Main


Gebruik van fully qualified names dus en het classpath setten naar de directory waar alle bestanden in staan.

(doh)!

~ Mijn prog blog!


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Goed dat je het hebt gevonden, maar let even op je naamgeving: packagenamen moeten volgens de geldende conventies met kleine letters geschreven worden.

En kijk ook eens naar tools als Ant en Maven, die helpen erg om het draaien van de command line makkelijker te maken.

"Any sufficiently advanced technology is indistinguishable from magic."


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

Ook je tweede oplossing is nog niet helemaal goed. Ja, het werkt, maar het is niet helemaal de bedoeling.

Het werkelijke probleem is dat je je programma neit moet runnen van uit een directory binnen je package structuur. Dat zie je ook doordat je de parent dir aan je classpath toe moet voegen. Wat je eigenlijk zou moeten doen is niet in de Main directory gaan staan, maar gewoon in de src directory. Vervolgens moet je runnen met java Main.Main.

Verder inderdaad ook nog even letten op de opmerking van Herko_ter_Horst. Het is niet de bedoeling om je package namen met hoofdletters te beginnen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Ah bedankt voor de tips inderdaad. En ja package names met kleine letters ik werk normaal met C# en daar heb je namespaces en die moeten dan wel weer met hoofdletters :) confusing maar je hebt zeker gelijk.

Ook het runnen vanuit de hoofd directory is een goede, dat klopt natuurlijk.

~ Mijn prog blog!