JForum - Powering Communities
  Sök   Nya ämnen     Användare    Tillbaka till hemsidan 
Registrera / 
Logga in 
hjälp! strul med jar och classpath  
Forum Index -> Generellt
Författare Inlägg
Jaxy



Blev medlem: Jan 16, 2010
Inlägg: 30
Offline

Bästa forumet!

Jag har ett väldigt problem med att köra mina klasser i en jar fil. De är uppdelade i ett mindre paketbibliotek men när jag skapar en jar utanför IDE-verktyg som eclipse eller netbeans vill inget fungera. Jag använder bara ett anspråkslöst grundläggande ide-verktyg. Jag ska försöka beskriva problemet nedanför.

1. Sökvägen till min mapp för mitt projekt är som följer D/projekt/java/mittprojekt. I huvudmappen "mittprojekt" har jag en mapp med samma namn för i den vill jag ha de övriga paketeten med klasserna mitt program är uppbyggt av. Jag har underpaket som heter "gui", "models", "events" etcetera.

2. Klassen med min main metod ligger en nivå över paketet "mittprojekt" i min huvudkatalog. Det är här jag vill ha jar filen. I manifestet skriver jag Main-Class:MinMainKlass men inget händer.

Nedanför följer ett förenklat exempel på hur jag delat upp mitt projekt. Jag vet inte vad jag ska skriva i manifest filen för att få jar filen att köra normalt. Jag har gått tillbaka till grunden igen beträffande jar hantering men det blir fortfarande fel.

Code:
 
 import mittprojekt.gui.MainJFrame;
 
 public class MinMainKlass {
   public static void main(String[] args) {
     new MinMainKlass();
   }
 
   public MinMainKlass() {
     new MainJFrame();
   }
 }         
 
 


3. Koden för klassen MainJFrame som är placerad i paketet gui ser ut som exempel.

Code:
 
 package mittprojekt.gui;
 import javax.swing.JFrame;
 
 public class MainJFrame extends JFrame {
   
   public MainJFrame() {
       //En massa kod ...
   }
 }
 
 


Det är nu jag undrar hur det ska se ut i manifest filen. Varför räcker det inte med att skriva Main-Class:MinMainKlass för att åberopa klassen MainJFrame i peketet gui? Jag hoppas någon förstående själ här kan se vad som strular för mig och vad jag missat. Jag har så mycket att lära. men ingen fråga är väl dum om den är ärligt menad
Lime



Blev medlem: Feb 21, 2007
Inlägg: 490
Offline

Okej, dax att dra förklaringen med namnrymd igen.

När du deklarerar en klass och säger att den tillhör ett viss paket, säg ipackage mittprojekt.gui så sätter du den klassen i en egen låda.

Paketstrukturen du använder kan sägas vara som referenserna i ett lager. Anta att vi deklarerar paketet se.jforum.generellt.nybörjarfrågor. I det paketet hittar du alla frågeklasser som hanterar nybörjarfrågorna. I paketet com.jforum.general.newbiequestions ligger de som hanterar engelska nybörjarfrågor.

Om du då står i en sådan låda, så kan du se allt som finns i samma låda. Det gör att två klasser som ligger i samma paket, inte behöver använda sig av import för att se varandra.

Så fort du vill använda något som ligger i ett annat paket/låda, måste du tala om att "hey, jag vill att du tittar i den här lådan efter de klasser jag försöker använda". Import är INTE en inkludering av en klass, det är bara en utökning av namnrymnden, eller helt enkelt vilka lådor du tänker kika i efter andra resurser.

Så, om du ska starta en klass, eller skriva klassnamnet i en manifest-fil, så måste du även här tala om i vilket paket du ska kika och ge HELA klassnamnet.

Alltså:
Main-Class: mittprojekt.gui.MinMainKlass, om det är där klasssen ligger.

Om den ligger i default-paketet, alltså längst ner, då ska det räcka att skriva som du skriver.

Det du också måste tänka på är att i JAR-filen måste du ha en exakt likadan struktur som du har på dina paket. Annars hittar inte JVM-en klasserna. Du kan alltså inte bara ta alla klass-filer och lägga dom i ett enda bibliotek.
Jaxy



Blev medlem: Jan 16, 2010
Inlägg: 30
Offline

tack så mycket Limester. Det knakar fortfarande i grundvalarna på en som så tydligt märks. jag försöker tänka på biblioteksstrukturen i java som strukturen för en website om det nu är rätt eller fel. jag förstår mig ändå inte på detta har bara gjort projekt skapade i en enda rotkatalog. men vill verkligen ta mig an detta. jag förstår inte varför det händer så ofta att man ibland hittar något bra java program man laddar ner och vill testa men när man kör det så får man den där berömda feldialogen från JVM-et som skriker ut åt en att "Failed to load Main-Class manifest attribute from ... bla bla bla ... " eller "Could not find the main class" som i mitt fall så man är väl inte ensam om strul i detta fall man har sett den feldialogen tusen tusen gånger varför ska det vara så svårt? Tänk om java program vore lika startsäkra som en adobe eller macromedia produkt.

http://www.jarticles.com/package/package_eng.html
Jaxy



Blev medlem: Jan 16, 2010
Inlägg: 30
Offline

det går inte så bra det här. jag får nog hålla mig till rotkatalogen. jag gör precis som du talat om och precis som det står i tutorials man hittar men ändå får man feldialogen från jvm-en. jag vill ju lära mig detta manuellt utan att vara beroende av eclipse eller netbeans så jag jobbar med jarverktyghet i själv bin katalogen i jdkpaketet där jag har java installerat. i denna mapp finns mitt projekt jag lyckas med att skapa jarfilen med jar -cf mittprojekt * men längre än så kommer man inte. får nog plugga mer.
Jaxy



Blev medlem: Jan 16, 2010
Inlägg: 30
Offline


Alltså:
Main-Class: mittprojekt.gui.MinMainKlass, om det är där klasssen ligger.

Om den ligger i default-paketet, alltså längst ner, då ska det räcka att skriva som du skriver.

Det du också måste tänka på är att i JAR-filen måste du ha en exakt likadan struktur som du har på dina paket. Annars hittar inte JVM-en klasserna. Du kan alltså inte bara ta alla klass-filer och lägga dom i ett enda bibliotek. 


Hej!

Mitt problem är som följande. Jag har tillexempel ett projekt som kallas för CineShelf och är uppdelat i hitills tre paket ui, io, och engine. Jag har placerat Main-klassen "CineShelf.class" i paketet engine. Denna åberopar instansen av min JFrame klass som heter MainJFrame och som är placerad i paketet ui. I klassen CineShelf skriver jag i headern "package cineshelf.engine;" vilket är väl rätt? I klassen MainJFrame skriver jag "package cineshelf.ui;" Underpaketen ui, io och engine ligger i ett moderpaket kallat just "cineshelf" i min hemprojektkatalog oj långt ord det där var hehe. Men hur som helst jag har inga problem med att köra och starta programmet i utvecklingsmiljön, en vanlig texteditor med stöd för att köra och kompilera java grejor. Problemet inträffar när jag försöker skapa en jar fil av hela applikationen jag är förtvilvlad över detta varför man aldrig kan lära sig det själv utan att använda sig av tungviktar-IDEs. Vad är det man missar? Hur ska jag skriva i manifest filen och hur ska jag skapa en sådan om jag skapar en manuell jar fil av projektet i till exempel bin katalogen där java är installerad? Finns det någon tutorial där ute som jag missat som täcker allt? Om jag har katalogen cineshelf med ovan beskriven struktur hur ska jag då skriva i kommandotolken för att skapa en körbar jar fil som inte protesterar. Hur som helst jag är väldigt tacksam för all hjälp man fått och får. Man har kört fast i grunderna.
Jaxy



Blev medlem: Jan 16, 2010
Inlägg: 30
Offline

this case i sölvd! jag fick till det rätt i kommandotolken till slut så det fungerar i alla fall som det är tänkt att göra på min maskin. det borde kanske hetat "write once run somewhere ... "

Code:
 jar cmf manifest.mf  CineShelf.jar cineshelf\*
 


Min manifest fil manifest.mf ser ut som nedanför och är placerad i jdk's bin katalog

Code:
 Manifest-Version: 1.0
 Main-Class: cineshelf.engine.CineShelf
 programToRun: CineShelf.jar
 packageName: cineshelf
 options: java -jar
 
Lime



Blev medlem: Feb 21, 2007
Inlägg: 490
Offline

Ett tips... Om du kompilerar dina klasser med javac är att använda -d flaggan så att alla klassfiler läggs i en egen katalog. Då sköter den skapandet av strukturer också.

Och eftersom det är okej att kompilera "för hand" om det är 2-5 filer så blir det lätt irriterande när man kommer över det antalet. Så använd en IDE eller lägg till ANT, Maven eller liknande i din kunskapsbank.
Jaxy



Blev medlem: Jan 16, 2010
Inlägg: 30
Offline

Gräääjt! Jag måste verkligen börja lära mig ANT och Maven och alla liknande jverktyg som hör dagen till att använda. Kan någon skicka bra länkar till tutorials om dessa samt var man kan ladda ner det man behöver för att komma igång på rätt sätt så vore det guld värt. Vissa IDEs är bekanta för en men ibland känns det som man tar genvägen och inte lär sig från grunden pga dessa.
krizsan



Blev medlem: Jan 10, 2007
Inlägg: 622
Offline

Hej!
Maven: http://maven.apache.org/
Ant: http://ant.apache.org/
SpringSource Tool Suite: http://www.springsource.com/products/sts
För Maven och Ant finns dokumentation eller länkar till dokumentation på projektsidorna.
Två gratis böcker om Maven finns här: http://www.sonatype.com/products/maven/documentation/book-defguide

SpringSource Tool Suite är Eclipse med ett antal plugins, bland annat för Maven, förinstallerade. I mitt tycke synnerligen bekvämt - ladda ner och kör.
Lycka till!
 
Forum Index -> Generellt
Gå till:   
Powered by JForum 2.1.4 © 2005 - Rafael Steil