Avatar billede casualty Nybegynder
02. november 2003 - 23:58 Der er 47 kommentarer og
1 løsning

Illegal UTF8 string in constant pool

Hjælp Hjælp...Jeg er på skideren...Undskyld sproget.

Jeg står med et mega problem...Jeg har kæmpet med at lave en applikation der skal deployes som en enkelt jarfil.
Der ligger en masse rescourser i denne jar fil .class/.dll/.txt -filer som den læser ind og skriver ud på disken. Det virker fint nok med .txt og .dll men den ødelægger åbenbart classfilerne.

jarfilen fungerer som en installer der hiver en masse jarfiler etc. ud og bla. laver en batfil med classpath mv. således at man kan eksekvere skidtet...
Men når man prøver at køre classfilerne får man følgende medd:

C:\>java -cp showfiles showfiles.MainUi
Exception in thread "main" java.lang.ClassFormatError: showfiles/MainUi (Illegal
UTF8 string in constant pool)
        at java.lang.ClassLoader.defineClass0(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$100(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)

Håber at der er nogen der har et bud på om det kan afhjælpes, eller om jeg er fortabt...

Mvh Casualty
Avatar billede arne_v Ekspert
03. november 2003 - 05:47 #1
Det lyder meget som om de er blevet skrevet forkert. De skal skrives
som .dll - ikke som .txt !

Du kan verificere om det er rigtigt ved at sammenligne kopier
og original.

Og hvis det er problemet så skal vi se lidt kode.
Avatar billede casualty Nybegynder
03. november 2003 - 18:32 #2
Jeg tror at jeg har fået forklaret mig forkert...Eller også så forstår jeg ikke hvad du mener...

jeg har en jarfil...Når jeg dobbeltklikker på den så henter den nogle classfiler(inde fra sig selv) og lægger dem ud på brugerens disk.
via:getClass().getResource

problemet er, at fra den henter classfilerne (fra sig selv) til den skriver dem ud på disken, så sker der et eller andet..

Jeg ved at classfilerne fungerer (jeg har selv skrevet, kompileret og testet dem) men når jarfilen kopierer dem ud på disken bliver de korrupte??
Avatar billede arne_v Ekspert
03. november 2003 - 19:15 #3
Jeg foreslår at du sammenligner de udpakkede filer med originalerne.

Er de ens ? (næppe fordi så virkede de vel)

Er de blevet mindre eller større ?

Hvilke bytes er forskellige ?
Avatar billede casualty Nybegynder
03. november 2003 - 22:35 #4
bytestørrelsen er præcis ens..Jeg forstår det ikke helt...

Hvis jeg eksekverer programmet uden at pakke det i en jarfil så smider den classfilerne ud på drevet og derefter kan de sagtens eksekveres ...men lige så snart den skal hente dem ud fra en jarfil så går der noget galt
Avatar billede arne_v Ekspert
03. november 2003 - 22:39 #5
Er der forskel hvis du samemnligner dem.

DOS (og Windows kommandoen):
  fc fil1 fil2
?
Avatar billede arne_v Ekspert
03. november 2003 - 22:40 #6
Hvordan skriver du dem FileOutputStream og write ? Eller ?
Avatar billede casualty Nybegynder
03. november 2003 - 22:40 #7
Hvis du vi se de forskellige filer så er de her:

originale classfiler inklusive .java:
http://bluepage.dk/exp/originale_klasser.zip

classfiler efter jar:
http://bluepage.dk/exp/jargenererede_klasser.zip
Avatar billede casualty Nybegynder
03. november 2003 - 22:41 #8
Øjeblik
Avatar billede casualty Nybegynder
03. november 2003 - 22:42 #9
FC: no differences encountered
Avatar billede arne_v Ekspert
03. november 2003 - 22:45 #10
Jeg kigger på dem.
Avatar billede casualty Nybegynder
03. november 2003 - 22:48 #11
Arne...Stop en halv...jeg har måske uploadet de forkerte filer...Øjeblik
Avatar billede arne_v Ekspert
03. november 2003 - 22:49 #12
Jeg får nemlig også samme fejl med de "originale" !

:-)
Avatar billede casualty Nybegynder
03. november 2003 - 22:52 #13
Piiiinligt...

Fra jar filen
http://bluepage.dk/exp/frajar

Originalfilen
http://bluepage.dk/exp/normal
Avatar billede arne_v Ekspert
03. november 2003 - 22:54 #14
De links kan jeg ikke hente noget fra (mangler der .zip ?).
Avatar billede casualty Nybegynder
03. november 2003 - 22:56 #15
Hmm...De viker fint her...Nej det er bare to classfiler uden extension på??
Jeg putter extension på det hjælper måske
Avatar billede casualty Nybegynder
03. november 2003 - 22:57 #16
Avatar billede arne_v Ekspert
03. november 2003 - 22:59 #17
No luck.
Avatar billede casualty Nybegynder
03. november 2003 - 23:02 #18
Damm...Hvad kan det dog være...prøv her:

Prøv nu

Fra jar filen
http://www.bluepage.dk/exp/frajar.class

Originalfilen
http://www.bluepage.dk/exp/normal.class

Nogle gange hjælper det...
Avatar billede arne_v Ekspert
03. november 2003 - 23:03 #19
"The document contains no data"
Avatar billede arne_v Ekspert
03. november 2003 - 23:03 #20
Kan du zippe dem og emaile dem til mig ?
Avatar billede casualty Nybegynder
03. november 2003 - 23:04 #21
What.....????
Jeg laver lige en ny mappe og omstrukturerer....det var da lige godt pokkers....
Avatar billede casualty Nybegynder
03. november 2003 - 23:06 #22
Prøv her...Ellers så må jeg maile eller noget:

http://www.bluepage.dk/eksperten/arne.zip
Avatar billede arne_v Ekspert
03. november 2003 - 23:06 #23
Den virkede fint.
Avatar billede casualty Nybegynder
03. november 2003 - 23:08 #24
Cool...Jeg har lige prøvet med fc FIL1 FIL2...der er forskel...
Avatar billede arne_v Ekspert
03. november 2003 - 23:09 #25
Det har jeg også lige !
Avatar billede casualty Nybegynder
03. november 2003 - 23:10 #26
Jeg skriver filerne med:
FileOutputStream os = new FileOutputStream(path+"\\"+fileName);
          os.write(content);
          os.close();
Avatar billede arne_v Ekspert
03. november 2003 - 23:10 #27
Så hvordan skriver du de filer ?
Avatar billede arne_v Ekspert
03. november 2003 - 23:11 #28
Too late.

Og hvor kommer content fra ?
Avatar billede casualty Nybegynder
03. november 2003 - 23:11 #29
byte[] content = JarFileGrabber.getInstance().getFile(fileName);
      if(content==null||content.length==0)
      {
        FrameTeller.getInstance().tell("Installationsprogrammet kunne ikke finde filen: "+fileName+"...");
        return false;
      }
      else
      {
        try
        {
          FileOutputStream os = new FileOutputStream(path+"\\"+fileName);
          os.write(content);
          os.close();
          FrameTeller.getInstance().tell("Kopierer "+fileName+" til "+path+"...");
          return true;
        }
        catch (Exception e)
        {
          FrameTeller.getInstance().tell("Fejl ved kopiering af filen: "+fileName+"...");
          return false;
        }
Avatar billede casualty Nybegynder
03. november 2003 - 23:14 #30
public byte[] getFile(String fileName)
  {
    byte[] contents;
    try
    {
      InputStream is = getClass().getResource("installclasses/"+fileName).openStream();
      contents = new byte[is.available()];
      is.read(contents);
      is.close();
      return contents;
    }
    catch(Exception e)
    {
      System.out.println(e);
    }
    return null;
  }
Avatar billede arne_v Ekspert
03. november 2003 - 23:19 #31
Jeg har kigget lidt på filerne.

De første 695 bytes er gode nok i "fra jar".

Resten af bytesene er 0 !
Avatar billede arne_v Ekspert
03. november 2003 - 23:24 #32
Nu kommer 10000 kroners spørgsmålet !

Returnerer is.read det samme som is.available ?
Avatar billede casualty Nybegynder
03. november 2003 - 23:25 #33
Øhh øjeblik..
Avatar billede arne_v Ekspert
03. november 2003 - 23:26 #34
InputStream is = getClass().getResource("installclasses/"+fileName).openStream();
      int n1 = is.available();
      contents = new byte[n1];
      int n2 = is.read(contents);
      if(n1!=n2) System.out.println("Upssss");
      is.close();
      return contents;
Avatar billede arne_v Ekspert
03. november 2003 - 23:27 #35
For fix prøv evt:

InputStream is = getClass().getResource("installclasses/"+fileName).openStream();
      int n1 = is.available();
      contents = new byte[n1];
      int ix = 0;
      while(ix < n1) {
          int n2 = is.read(contents,ix,n1-ix);
          ix += n2;
      }
      is.close();
      return contents;
Avatar billede casualty Nybegynder
03. november 2003 - 23:29 #36
jeg testede det således:

public byte[] getFile(String fileName)
  {
    byte[] contents;
    try
    {
      InputStream is = getClass().getResource("installclasses/"+fileName).openStream();
      contents = new byte[is.available()];
      System.out.println(is.available());
      System.out.println(is.read(contents));
      is.close();
      return contents;
    }
    catch(Exception e)
    {
      System.out.println(e);
    }
    return null;
  }

og de returnerede det samme:

1.fil:
793
793

2.fil:
3758
3758
Avatar billede arne_v Ekspert
03. november 2003 - 23:32 #37
Og filen er stadig bad ?
Avatar billede arne_v Ekspert
03. november 2003 - 23:35 #38
Mystisk.

Har du checket at filen er god nok inde i jar'en ?

F.eks. ved at ekstracte med:

jar xvf foobar.jar showFiles/MainUi.class

Og så checke den fil ...
Avatar billede casualty Nybegynder
03. november 2003 - 23:37 #39
Jeg prøvede at sætte din logik ind i min metode...Og hvad skete der...det virkede bare...Nu kører det....Respekt til dig...
Avatar billede arne_v Ekspert
03. november 2003 - 23:38 #40
Eller nemmere hvis du kan lave zipinfo -v (eller tilsvarende med
WinZip) og se den komprimerede størrelse:

468 fylder den dårlige
1981 fylde den gode

(begge 3758 ukomprimeret)
Avatar billede arne_v Ekspert
03. november 2003 - 23:39 #41
??

Ja - nu forstår jeg ikke noget.

Men jeg har en stærk mistanke om at du er ret ligeglad hvorfor
det virker bare det virker !

:-)
Avatar billede casualty Nybegynder
03. november 2003 - 23:42 #42
Det er jeg bestemt ikke...Ligenu er jeg bare glad for at det ikke var én eller anden bug jeg skulle kæmpe med...Hvad er det du ikke forstår?

Det eneste jeg gjorde var at bytte metodens logik ud med den du havde postet i 23:27:38
Avatar billede arne_v Ekspert
03. november 2003 - 23:47 #43
Jo - det er også en ganske standard logik til læsning.

Men umiddelbart skulle jeg mene at den kun ville løse
problemet hvis is.available og is.read returnerede forskellige tal !

Derfor er jeg forvirret.

Men i dit sammenlignings eksempel kaldte du is.availeble 2 gange, måske ...
Avatar billede casualty Nybegynder
03. november 2003 - 23:48 #44
Jeg testede med :
System.out.println(is.available());
      System.out.println(is.read(contents));

Burde det ikke give det rigtige svar?
Avatar billede casualty Nybegynder
03. november 2003 - 23:49 #45
Nåhr du mener:
contents = new byte[is.available()];
      System.out.println(is.available());
      System.out.println(is.read(contents));
Avatar billede arne_v Ekspert
03. november 2003 - 23:51 #46
Ja.

Jeg spekulerer på om det ekstra kald påvirkede is.read ...

Langt ude, men hele den ekstra løkke skulle kun gøre en forskel,
hvis is.read retrnerer mindre end is.available !
Avatar billede casualty Nybegynder
03. november 2003 - 23:55 #47
Det ville være rart at vide hvad der spillede ind. Selvfølgelig er det rart når det "bare" virker, men det optimale er jo at finde fejlen så man kan tage det med som en erfaring... Når jeg får tid (engang i 2024) vil jeg sætte mig ned og prøve at teste lidt på de forskellige metoder. Men hold da op jeg er glad for det kører nu...Arne læg et svar..
Avatar billede arne_v Ekspert
03. november 2003 - 23:57 #48
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester