ubuntuusers.de

java compilierfehler: "bad class file: ./jexcelapi/jxl/Workbook.class" (API: jexcelapi)

Status: Gelöst | Ubuntu-Version: Ubuntu 8.04 (Hardy Heron)
Antworten |

zwän

Anmeldungsdatum:
15. Mai 2007

Beiträge: 12

Wohnort: hamburg

moin,

ich hab dem tutorial entsprechend ein kleines testprogramm geschrieben um den umgang mit der jexcelapi kennen zu lernen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import java.io.File;
import java.util.Date;
import jexcelapi.jxl.*; 

class excelTry {
    public static void main(String[] args) {

        Workbook workbook = Workbook.getWorkbook(new File("/home/sven/Desktop/Dienstplan-ND2-2010--2.xls")); 
        
        Sheet sheet = workbook.getSheet(7);

        Cell a1 = sheet.getCell(2,12); 
        
        String stringa1 = a1.getContents(); 
        
        System.out.println(stringa1);
    }
}

leider kriege ich folgende fehlermeldung:

excelTry.java:8: cannot access jexcelapi.jxl.Workbook
bad class file: ./jexcelapi/jxl/Workbook.class
class file contains wrong class: jxl.Workbook
Please remove or make sure it appears in the correct subdirectory of the classpath.
Workbook workbook = Workbook.getWorkbook(new File("/home/sven/Desktop/Dienstplan-ND2-2010--2.xls"));
^
1 error
Übersetzung fehlgeschlagen.

hat jemand von euch da eine idee, was man da machen muss?

lg sven

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Die Klasse jxl.Workbook muss in einem Verzeichnis jxl liegen, welches seinerseits im CLASSPATH sein muß. Ich verstehe die Fehlermeldung so, dass die Klasse am falschen Ort gefunden wird - als jexcelapi.jxl.Workbook vielleicht?

Hast Du die Workbook-Datei selbst erzeugt? Verschoben?

zwän

(Themenstarter)

Anmeldungsdatum:
15. Mai 2007

Beiträge: 12

Wohnort: hamburg

also die datei Workbook.class hat von dem verzeichnis, in dem der programmcode liegt den pfad jexcelapi/jxl/Workbook.class genau so, wie es sich frisch aus der .jar entpackt hat.

könnte es sein, dass

class file contains wrong class: jxl.Workbook

bedeutet, dass eine der klassen, auf die die workbook klasse zugreift kaputt ist bzw im falschen direktory liegt?

edit: ich hab folgende zwei sachen ausprobiert und in beiden fällen wird die gleiche fehlermeldung ausgegeben. 1. ich habe die Workbook.class direkt importiert. 2. ich habe statt der version 2.6.12 die version 2.5.9 der api verwendet.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Was steht denn in der Workbook.java-Datei, zu welchem package sie gehört?

1
2
3
package jexcelapi.jxl;
// oder  
package jxl;

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Servus,

um user unknowns Frage zu beantworten: Es wäre „jxl“ ohne „jexcelapi“. Tada! 😉

zwän schrieb:

genau so, wie es sich frisch aus der .jar entpackt hat.

Gibt es einen Grund, warum du die JAR entpacken musst? Du kannst sie auch als Ganzes in den Classpath setzen.

Also, will sagen: Die Klassen der jexcel-API sind alle so definiert, dass sie an oberster Stelle im Java-Package „jxl“ liegen. Package-Namen und Verzeichnisnamen müssen zusammenfallen. Das heißt, eine Klasse „foo.bar.MeineKlasse“ muss auch im Verzeichnis „foo/bar/“ liegen. Das hast du sicher auch schon gewusst, sonst hättest du nämlich dein „import“-Statement nicht angepasst. Was dein angepasstes „import“ aber aussagt, ist, dass auf eine Klasse namens „jexcelapi.jxl.Workbook“ zugegriffen werden soll: eine Klasse „Workbook“ aus dem Package „jexcelapi.jxl“. Das stimmt zwar zufällig mit dem Pfad im Dateisystem überein, aber die Klasse „Workbook“ wurde so definiert, dass sie nur im Package „jxl“ liegt.

Daher beschwert sich dein Compiler, dass er die Datei zwar findet, darin aber eine andere Klasse ist (weil die Information über das Package falsch ist).

Du kannst mit den „import“-Statements keine beliebigen Pfade im Dateisystem angeben. Dort muss immer das korrekte Package stehen, wo auch immer sich das auf deiner Festplatte dann befindet. Belasse es also bei einem einfachen:

1
import jxl.*; 

Damit der Compiler das dann auch findet, musst du den Classpath erweitern. Wenn du an der Kommandozeile kompilierst und du dir den Schritt mit dem Entpacken der JAR mal sparst, dann kann das so aussehen:

$ javac -cp /pfad/zur/jxl.jar ExcelTry.java 

(Klassennamen beginnen übrigens immer mit einem Großbuchstaben. Auch im Quellcode.)

Wenn du das ausführen willst, hast du dasselbe Problem nochmal. Diesmal müssen sich aber die jxl-Klassen und auch deine eigenen Klassen im Classpath befinden. Angenommen, deine Klasse sieht so aus wie du das oben hast (befindet sich also im Default-Package) und du befindest dich in dem Verzeichnis, in dem die „ExcelTry.class“ befindet, dann so:

$ java -cp .:/pfad/zur/jxl.jar ExcelTry 

Dein Classpath besteht dann aus „.“, also dem aktuellen Verzeichnis, und der „jxl.jar“. Ausgeführt wird die Klasse „ExcelTry“. Das findet er dann alles (… nachdem du dich im Quellcode um die Exceptions gekümmert hast, wird es auch laufen, aber das wirst du dann schon merken).

HTH. ☺

thomsen

Avatar von thomsen

Anmeldungsdatum:
9. Juni 2010

Beiträge: 188

Wohnort: Hamburg

Vain hat Recht. Die Jar nicht entpacken sondern so wie sie ist in den Classpath packen. Und dann kannste einfach per import jxl.* die Klassen darin nutzen.

zwän

(Themenstarter)

Anmeldungsdatum:
15. Mai 2007

Beiträge: 12

Wohnort: hamburg

wenn ich die jxl.jar in den ordner mit dem quellcode meines programms packe und mit

1
import jxl.*; 

importiere, dann sagt er mir beim kompilieren (über geany) als fehler

ExcelTry.java:3: package jxl does not exist

edit: das müsste doch eigentlich im classpath liegen, wenn es in dem selben ordner ist, wie der programmcode der zu kompilieren ist, oder?

edit: ich hab jetzt auch vains post verstanden 😉, klappt also im terminal abgesehen von den exceptions (bei geany allerdings immernoch nicht, 😕 ). allerdings weiß ich nicht, was ich wegen der exceptions genau machen muss. als erstes gibt er mir aus

unreported exception java.io.IOException; must be caught or declared to be thrown 

also habe ich mal ausprobiert und java.io.* importiert und dann die IOException eingeworfen

1
public static void main(String[] args) throws IOException

dann gibt er das aus

 unreported exception jxl.read.biff.BiffException; must be caught or declared to be thrown 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

thomsen schrieb:

Vain hat Recht. Die Jar nicht entpacken sondern so wie sie ist in den Classpath packen. Und dann kannste einfach per import jxl.* die Klassen darin nutzen.

Das dann ist falsch. Man kann auch die Klassen auspacken und nutzen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

zwän schrieb:

edit: das müsste doch eigentlich im classpath liegen, wenn es in dem selben ordner ist, wie der programmcode der zu kompilieren ist, oder?

Nein, wieso?

Der CLASSPATH ist eine Liste von Orten, an denen die Klassen liegen. Ein Ort ist entweder ein Verzeichnis, oder eine Jar-Datei.

Was ein Ort nicht ist: alle Jars in einem Verzeichnis oder ein Jar in einem anderen Jar, oder Verzeichnisse in dem Verzeichnis.

also habe ich mal ausprobiert und java.io.* importiert und dann die IOException eingeworfen

Man wirft Exceptions (Punkt), nicht ~ein. Pillen wirft man ein (besser nicht!).

unreported exception jxl.read.biff.BiffException; must be caught or declared to be thrown

also auch

1
... throws jxl.read.biff.BiffException

bzw. in der gleichen Zeile, und wenn jxl.read.biff.* importiert wird

1
public static void main(String[] args) throws IOException, BiffException

zwän

(Themenstarter)

Anmeldungsdatum:
15. Mai 2007

Beiträge: 12

Wohnort: hamburg

ok leute, es kompiliert einwandfrei 😀 vielen dank für die hilfe!

gruß sven

edtit: was für ein verb benutzt man denn für exceptions?

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

zwän schrieb:

edtit: was für ein verb benutzt man denn für exceptions?

werfen statt einwerfen

zwän

(Themenstarter)

Anmeldungsdatum:
15. Mai 2007

Beiträge: 12

Wohnort: hamburg

ah, danke ☺

Antworten |