# [SOLVED]packages in eclipse



## metalfan (19. Mrz 2006)

Hi,

eclipse treibt mich grade in den Wahnsinn, ein GUI Projekt bestehend aus 4 java Datein sollte mein Einstieg in die Welt der packages werden...
Also mit eclipse ein Projekt angelegt, file -> new -> package diese packete angelegt: buecherei.command, buecherei.gui, buecherei.event, buecherei.main
Die entsprecheden Code Datein in die packages verschoben, die package anweisung am anfang der datei hinzugefügt und im Hauptprogramm import buecherei.*; eingesetzt.

Das Ganze sieht dann so aus:


```
// in package buecherei.main
package buecherei.main;
import java.awt.*;
import java.awt.event.*;
import buecherei.*;

public class Listing2805
{
    public static void main(String[] args)
    {
        MainFrameCommand cmd = new MainFrameCommand();
        MainFrameGUI     gui = new MainFrameGUI(cmd);
    }
}

//in package buecherei.command
package buecherei.command;
import java.awt.*;
import java.awt.event.*;

//class MainFrameCommand implements KeyListener
class MainFrameCommand extends KeyAdapter
{
    public void keyPressed(KeyEvent event)
    {
        Frame source = (Frame)event.getSource();
        if (event.getKeyCode() == KeyEvent.VK_ESCAPE)
        {
            source.setVisible(false);
            source.dispose();
            System.exit(0);
        }
    }
}



//in package buecherei.gui
package buecherei.gui;
import java.awt.*;
import java.awt.event.*;

class MainFrameGUI extends Frame
{
    //public MainFrameGUI(KeyListener cmd)
    public MainFrameGUI(KeyAdapter cmd)
    {
        super("Nachrichtentransfer");

        //Instanz der Klasse WindowClosingAdapter erzeugen um den X Button zu belegen
        addWindowListener(new WindowClosingAdapter(true));

        //setBackground(Color.lightGray);
        setSize(300,200);
        setLocation(200,100);
        setVisible(true);
        addKeyListener(cmd);
    }


    public void paint(Graphics g)
    {
        g.setFont(new Font("Serif",Font.PLAIN,18));
        g.drawString("Zum Beenden bitte ESC drücken...",10,50);
    }

}

// in package buecherei.event
package buecherei.event;
import java.awt.*;
import java.awt.event.*;

public class WindowClosingAdapter
extends WindowAdapter
{
  private boolean exitSystem;

  /**
   * Erzeugt einen WindowClosingAdapter zum Schliessen
   * des Fensters. Ist exitSystem true, wird das komplette
   * Programm beendet.
   */
  public WindowClosingAdapter(boolean exitSystem)
  {
    this.exitSystem = exitSystem;
  }

  /**
   * Erzeugt einen WindowClosingAdapter zum Schliessen
   * des Fensters. Das Programm wird nicht beendet.
   */
  public WindowClosingAdapter()
  {
    this(false);
  }

  public void windowClosing(WindowEvent event)
  {
    event.getWindow().setVisible(false);
    event.getWindow().dispose();
    if (exitSystem) {
      System.exit(0);
    }
  }
}
```

Das Kompilieren von Listing2805 endet mit diesem Fehler:
Exception in thread "main" java.lang.NoClassDefFoundError: Listing2805

Was möchte mir java damit sagen?

Interessant sind zwar nur die Köpfe der jeweiligen Daten, habe aber trotzdem den Code der vollständigkeit hinzugefügt. Der Code läuft ohne die package Geschichte.


----------



## byte (19. Mrz 2006)

```
import buecherei.*;
```

Damit werden alle Klassen importiert, die sich direkt im Package buecherei befinden. Deine Klassen befinden sich aber jeweils noch in Unterpackages des Package buecherei. Du musst also auch diese Klassen explizit importieren, also z.B.:


```
import buecherei.main.*;
```


Jetzt noch ein Tipp: Da Du ja mit Eclipse arbeitest, brauchst Du Dich um die Importe nicht direkt selbst kümmern. Du benutzt einfach die entsprechende Klasse im Code und drückst dann STRG +  SHIFT + O und Eclipse macht die Importe automatisch bzw. fragt nach, falls er mehrere Klassen mit dem Namen kennt.

Und jetzt noch ein Tipp: Wenn Du strukturelle Veränderungen an Deinem Projekt in Eclipse vornimmst, also z.B. eine Klasse in ein neues Packages transportieren möchtest, dann nutze die Refactor Methode. Dann brauchst Du nicht per Hand den Code zu ändern (also z.B. die Package Bezeichnung). Das geht dann automatisch.


----------



## metalfan (19. Mrz 2006)

Dies sind jetzt die ersten Zeilen aus Klasse Listing2805

package buecherei.main;

import buecherei.command.*;
import buecherei.gui.*;
import buecherei.event.*;

Leider mit der gleichen Fehlermeldung 

Ein Strg+Alt+o  entfernt alle import Anweisungen, der Fehler bleibt?


Hier der aktuelle Stand, hab selber den Überblick verloren was sich alles geändert hat....Momentan zeigt zumindest Eclipse keine Warnungen mehr an, die Ausführung des Programms wird mit:

Exception in thread "main" java.lang.NoClassDefFoundError: Listing2805

beendet.


```
package buecherei.command;
import java.awt.*;
import java.awt.event.*;

//class MainFrameCommand implements KeyListener
public class MainFrameCommand extends KeyAdapter
{
    public void keyPressed(KeyEvent event)
    {
        Frame source = (Frame)event.getSource();
        if (event.getKeyCode() == KeyEvent.VK_ESCAPE)
        {
            source.setVisible(false);
            source.dispose();
            System.exit(0);
        }
    }
}



package buecherei.event;
//import java.awt.*;
import java.awt.event.*;

public class WindowClosingAdapter
extends WindowAdapter
{
  private boolean exitSystem;

  /**
   * Erzeugt einen WindowClosingAdapter zum Schliessen
   * des Fensters. Ist exitSystem true, wird das komplette
   * Programm beendet.
   */
  public WindowClosingAdapter(boolean exitSystem)
  {
    this.exitSystem = exitSystem;
  }

  /**
   * Erzeugt einen WindowClosingAdapter zum Schliessen
   * des Fensters. Das Programm wird nicht beendet.
   */
  public WindowClosingAdapter()
  {
    this(false);
  }

  public void windowClosing(WindowEvent event)
  {
    event.getWindow().setVisible(false);
    event.getWindow().dispose();
    if (exitSystem) {
      System.exit(0);
    }
  }
}



package buecherei.gui;
import java.awt.*;
import java.awt.event.*;
import buecherei.event.*;

class MainFrameGUI extends Frame
{
    //public MainFrameGUI(KeyListener cmd)
    public MainFrameGUI(KeyAdapter cmd)
    {
        super("Nachrichtentransfer");

        //Instanz der Klasse WindowClosingAdapter erzeugen um den X Button zu belegen
        addWindowListener(new WindowClosingAdapter(true));

        //setBackground(Color.lightGray);
        setSize(300,200);
        setLocation(200,100);
        setVisible(true);
        addKeyListener(cmd);
    }


    public void paint(Graphics g)
    {
        g.setFont(new Font("Serif",Font.PLAIN,18));
        g.drawString("Zum Beenden bitte ESC drücken...",10,50);
    }

}



package buecherei.main;

import buecherei.command.*;
import buecherei.gui.MainFrameGUI;


public class Listing2805
{
    public static void main(String[] args)
  
    {
        MainFrameCommand cmd = new MainFrameCommand();
        MainFrameGUI     gui = new MainFrameGUI(cmd);
    } 
}
```
[/code]


----------



## Roar (19. Mrz 2006)

Antwort: http://www.java-forum.org/de/viewtopic.php?t=1527


----------



## metalfan (20. Mrz 2006)

Danke für die Antwort, habe alles überprüft, eimmal das public ergänzt.
Den Classpath sollte eclipse automatisch setzen?

Aber irgendwas passt immer noch nicht:


```
package buecherei.main;

import buecherei.command.*;
import buecherei.gui.*;


public class Listing2805
{
    public static void main(String[] args)
  
    {
        buecherei.command.MainFrameCommand cmd = new buecherei.command.MainFrameCommand();
        buecherei.gui.MainFrameGUI     gui = new buecherei.gui.MainFrameGUI(cmd);
    } 
}
```

Help


----------



## Redfrettchen (20. Mrz 2006)

Hi,
du must das package nicht immer angeben, wenn du eine Klasse importierst:

```
package buecherei.main; 

import buecherei.command.*; 
import buecherei.gui.*; 

public class Listing2805 { 
    public static void main(String[] args) { 
        MainFrameCommand cmd = new MainFrameCommand(); 
        MainFrameGUI     gui = new MainFrameGUI(cmd); 
    } 
}
```

Aber ob das der Fehler ist, weiß ich nicht.


----------



## metalfan (20. Mrz 2006)

Aha, naja hab das ganze jetzt soweit vereinfacht das es laufen sollte...tut es natürlich nicht.

Es gibt nur noch das package main, jede Klasse hat package main; als erste Zeile in der .java Datei stehen, ändert jedoch an der Fehlermeldung nichts 

Kompilieren lässt sich das ganze mit:

```
~/.eclipse/workspace/Bücherei/buecherei/main $
 javac -classpath ~/.eclipse/workspace/Bücherei/buecherei/ Listing2805.java

Fehlermeldung:
~/.eclipse/workspace/Bücherei/buecherei/main $ 
java -classpath ~/.eclipse/workspace/Bücherei/buecherei/ Listing2805
Exception in thread "main" java.lang.NoClassDefFoundError: Listing2805
```


```
~/.eclipse/workspace/Bücherei/buecherei/main $ ls -lh
insgesamt 16K
-rw-r--r--  1 metalfan users 247 20. Mär 22:12 Listing2805.java
-rw-r--r--  1 metalfan users 404 20. Mär 22:10 MainFrameCommand.java
-rw-r--r--  1 metalfan users 690 20. Mär 22:10 MainFrameGUI.java
-rw-r--r--  1 metalfan users 748 20. Mär 22:10 WindowClosingAdapter.java

package main;
import java.awt.*;
import java.awt.event.*;

public class Listing2805
...


package main;
import java.awt.*;
import java.awt.event.*;

public class MainFrameCommand extends KeyAdapter
...


package main;
import java.awt.*;
import java.awt.event.*;

public class MainFrameGUI extends Frame
...


package main;
import java.awt.*;
import java.awt.event.*;

public class WindowClosingAdapter extends WindowAdapter
...
```

Testweise habe ich eine Klasse die auf keine anderen angewiesen ist mit javac -classpath... und java -classpath..... erfolgreich ausgeführt. Nur diese 4 wollen nicht zusammen spielen


----------



## Roar (20. Mrz 2006)

ich verweis noch immer auf: http://www.java-forum.org/de/viewtopic.php?t=1527 ...


----------



## metalfan (20. Mrz 2006)

Mist, javac -classpath pfad main.Listing2815 wars.

Danke für die Hilfe.

Julius


----------

