# java.lang.NoClassDefFoundError: jxl/write/WritableWorkbook



## cuchulainn (17. Dezember 2008)

Hallo alle zusammen,

ich versuche gerade mit JExcel zu arbeiten. Und zwar möchte ich es in einer Web-Anwendung mit Hibernate und IceFaces zusammen verwenden. Ich arbeite mit Eclipse und dem IceFaces-Plugin.

Jetzt habe ich mir eine Klasse ExcelUtil geschrieben, die mehrere Methoden anbieten soll, um bestimmte Daten in einer Excel-Datei abzuspeichern. So weit komme ich aber nicht, weil ich jedes mal eine "java.lang.NoClassDefFoundError: jxl/write/WritableWorkbook" erhalte. 

Aber die Datei jxl.jar befindet sich im Verzeichnis /WEB_INF/lib wie alle anderen jars auch. Eclipse erkennt auch die imports jxl.* und jxl.write.*.

Woran kann das noch liegen? Hat jemand eine Idee? 


Im Folgenden noch meine Klasse. Ich versuche, die Methode createAlphabeticalLodgerList() aufzurufen. Dann erscheint die Exception direkt am Anfang. Er betritt die Methode nicht einmal. Es wird wohl nicht an meinem Code liegen. Wenn dort Fehler drin sind, machen die sich noch nicht bemerkbar.


```
package de.waldhausweg7.utils;

import java.io.File;
import java.util.List;

import javax.faces.event.ActionEvent;

import jxl.*;
import jxl.write.*;
import de.waldhausweg7.model.Lodger;
import de.waldhausweg7.service.LodgerService;

public class ExcelUtil {
	public static final String FILE_ALPHABETICAL_LIST = "alphabetischeMieterliste.xls";
	public static final String ALPHABETICAL_LODGERLIST = "Alphabetische Mieterliste";
	/**
	 * Anzahl der Zeilen in der ersten Spalte.
	 */
	public static final int ROWS = 6;
	
	public void createAlphabeticalLodgerList() {
		try {
			WritableWorkbook workbook = Workbook.createWorkbook(new File(FILE_ALPHABETICAL_LIST));
			WritableSheet sheet = workbook.createSheet(ALPHABETICAL_LODGERLIST, 0);
			
			LodgerService lodgerService = new LodgerService();
			List lodgerList = lodgerService.getLodgerList();
			
			// Die ersten 30 Zeilen.
			for (int i = 0; i < ROWS; i++) {			
				Lodger lodger = (Lodger)lodgerList.get(i);
				// Eintragen des Namens
				Label labelName = new Label(i, 0, (lodger.getSurName() + ", " + lodger.getFirstName()));
				sheet.addCell(labelName);
				// Eintragen der Zimmernummer
				Label labelRoom = new Label(i, 1, ((Integer)lodger.getCurrentRoom().getRoomId()).toString());
				sheet.addCell(labelRoom);
			}
			
			for (int i = ROWS; i < lodgerList.size(); i++) {
				Lodger lodger = (Lodger)lodgerList.get(i);
				// Eintragen des Namens
				Label labelName = new Label(i, 0, (lodger.getSurName() + ", " + lodger.getFirstName()));
				sheet.addCell(labelName);
				// Eintragen der Zimmernummer
				Label labelRoom = new Label(i, 1, ((Integer)lodger.getCurrentRoom().getRoomId()).toString());
				sheet.addCell(labelRoom);				
			}
			
			workbook.write();
			workbook.close();
		} catch (Exception e) {
			System.out.println("ExcelUtil.createAlphabeticalLodgerList: " + e.getMessage());
		}
	}
	
	public void saveAlphabeticalLodgerList(ActionEvent event) {
		createAlphabeticalLodgerList();
	}
	
}
```

Bei allen anderen jars gab es keine Probleme, wenn ich sie einfach ins lib-Verzeichnis kopiert habe. Mehr habe ich nie tun müssen.

Hat jemand eine Idee, woran das liegen könnte?


----------



## vfl_freak (17. Dezember 2008)

Moin,

hast Du schon mal den Import mit komplettem Pfad versucht?

```
import jxl/write/WritableWorkbook;
```
Sowas wirkt bei mir manchmal Wunder ..... ohne das ich weiß, warum 

Gruß
Klaus


----------



## cuchulainn (17. Dezember 2008)

Hallo Klaus,

danke für deine Antwort, aber "import jxl/write/WritableWorkbook;" schluckt er leider nicht. Ich bekomme die Fehlermeldung: Syntax error on token(s), misplaced construct(s)

Viele Grüße,

Christopher


----------



## vfl_freak (17. Dezember 2008)

Hallo Christopher,

leider kenne ich dies "jxl" nicht - und hatte auch dieses Problem noch nicht!  
Wäre denn die Package so überhaupt korrekt beschrieben?



> Eclipse erkennt auch die imports jxl.* und jxl.write.*


Weil keine Fehler angezeigt werden?

Sonst überprüf mal Deinen Erstellungspfad - resp. lösch die LIB dort mal raus und füge sie dann neu ein!! Das hat bei mir auch schon mal geholfen!

Eventuell kommt  das Problem ja auch erst beim Compilieren! 
Wie arbeitest Du da? Mit Ant?

So, ich muss gleich noch in eine Besprechung!
Erstmal viel Erfolg - und vielleicht weiß hier noch jemand Rat!

Es gibt übrigens über die Suche hier etliche Einträge zum Stichwort "NoClassDefFoundError" - schau doch dort noch mal, ob Du auf die richtige Fährte kommst!

Gruß
Klaus


----------



## The_S (18. Dezember 2008)

1.) Auch wenns im lib liegt, im Zweifelsfall den Build-Path anpassen
2.) Mach doch mal das JAR auf und sieh nach, ob deine Klasse drin liegt


----------



## takidoso (18. Dezember 2008)

Hi,
Also zunächst erscheint es mir so, dass Deine Ablaufumgebung nicht zu stimmen scheint. Du kannst es offenbar compilieren, sonst hättest Du schon bei der Übersetzung Fehler bekommen. 
Wie läßt Du Dein Programm denn ablaufen? auch in Eclipse oder inzwischen außerhalb?
Auf welche Weise hast Du die jxl.jar Eclipse bekannt gemacht?
schau doch mal in Deinen Java-Buildpath nach, den findes Du unter Projekt-Eigenschaften.
Ich selbst pflege bibliotheken unter logischen Namen in Eclipse einzubinden, der Vorteil ist, dass man dann etwas weniger abhängig von physischen Pfaden ist.
(kleine Anleitung lege ich mit im anhang sowie Beispiel wie es bei mir ausschaut.)

viel Glück 

Takidoso


----------



## cuchulainn (18. Dezember 2008)

Hallo,

vielen vielen Dank für eure Hilfe.

Es ist seltsam. Ich bin ja kein Anfänger mehr und habe schon oft Bibliotheken eingebunden. Die Lage ist jetzt folgendermaßen:

Ich habe die jxl.jar noch einmal heruntergeladen. Sie befindet sich im Ordner /webcontent/WEB-INF/lib (behauptet jedenfalls mein Windows-Explorer)

Wenn ich "Projectproperties" -> "Java Build Path" -> "Add External Jar" benutze, macht Eclipse keine Schwierigkeiten. Erst wenn ich das Projekt mit Tomcat starte, kommt diese ClassNotFoundException. Aber Eclipse selbst hat sie erkannt. Die import-Anweisungen funktionieren, ich kann sämtliche Methoden aufrufen, Eclipse zeigt keinen Fehler an. Erst wenn ich mit Tomcat starte. Aber ich lasse das Projekt von Eclipse und dem ICesFaces-Plugin deployen und bis jetzt hatte ich noch nie Schwierigkeiten. Die Klasse ist auch in der jar-Datei vorhanden. Das habe ich geprüft.

Benutze ich "WIndow" -> "Preferences" -> "Java" -> "Build Path" -> User Libraries", kann ich die Datei auswählen, aber sobald ich den Dialog schließe und wieder öffne, zeigt Eclipse mir an: "Library is missing". 

Der Explorer von Windows wie auch der Dateiexplorer von Eclipse zeigen mir beide an, dass die Datei vorhanden ist. 

Ich weiß nicht, wie es euch geht, aber ich finde das absolut unlogisch. Und ich kann mir dieses Verhalten nicht erklären. Vor allem weil ich schon viele jars eingebunden habe (Hibernate, IceFaces, Spring, usw.) und ich hatte nie Probleme. 

Hat so etwas schon mal jemand erlebt?


Übrigens habe ich die jar auch neu ins Verzeichnis kopiert, neu heruntergeladen und dann noch einmal rein kopiert. Und nichts hat geholfen. Allmählich verzweifle ich.


----------



## vfl_freak (18. Dezember 2008)

Moin,

hmmm, klingt in der Tat seltsam - allerdings muss ich gestehen, auch kein Tomcat zu benutzen (und damit zu kennen) 

Arbeite auch erst seit etwas über einem Jahr mit Java/JBuilder (komme eigentlich aus der C/C++/VS - Welt (bzw. bin es für unsere Server auch noch) - und da bringen mich solche Dinge bei Java auch oft zur Verzweifelung :-(

Gruß
Klaus


----------



## takidoso (18. Dezember 2008)

hi,
also wenn ich Dich nun richtig verstanden habe, hast Du ein Problem dann mit Tomcat.
leider sind die Zeiten, da ich mit Tomcat gearbeitet habe herzlich lange her... aber irgendwo muss auch dort der class-path erweitert werden, sofern er dass nicht automatisch macht.
schau doch mal die Doku vom Tomcat an, wo er Bibliotheken, die er selbst erwartet (und damit meine ich nicht die die er z.B. für Java Web Start bereithält).

viel Glück

Takidoso


----------



## cuchulainn (20. Dezember 2008)

Vielen Dank für eure Hinweise,

jetzt hat sich herausgestellt, dass wir die Excel-Funktionalitäten doch vorerst nicht benötigen. Ich werde also erst einmal an anderen Baustellen arbeiten, aber das hier behalte ich im Auge. Wenn ich eine Lösung finde, poste ich sie selbstverständlich. 

Viele Grüße,

Christopher


----------



## Clash (22. Dezember 2008)

Hallo,
falls du das ganze als Web Project in Eclipse erstellt hast, musst in Properties -> Java EE Module Dependencies für das Jar noch ein Häckchen setzen. Damit kopiert er das Jar ins Ausführungsverzeichnis vom Tomcat und du kannst die Lib auch in deiner Web Anwendung nutzen. 
Grüße,
Clash


----------

