Avatar billede trp79 Nybegynder
06. august 2003 - 10:11 Der er 16 kommentarer og
1 løsning

Hente url fra jar-fil

Hejsa,
Som det er nu, sætter jeg en system property med:

System.setProperty("javax.net.ssl.trustStore",      "settings\\truststore.dat");

Jeg vil dog gerne i stedet hente truststore.dat fra jar filen, så jeg ikke er afhængig af afdre filer end dem der ligger i jar filen. Hvordan løser jeg dette problem?

Jeg har prøvet med:
URL truststore = getClass().getResource("truststore.dat");
System.setProperty("javax.net.ssl.trustStore",truststore.toString());

Men det funker ikke rigtig :o(

Håber nogle har nogle ideer....

mvh
Torben
Avatar billede arne_v Ekspert
06. august 2003 - 10:16 #1
Det burde ikke være noget problem for din applikation at åbne filen
med truststore.openStream().

Men hvis det der læser javax.net.ssl.trustStore property ikke
kan hente fra jar fil men kun fra disk, så hjælper det jo
ikke meget.

truststore.toStrng() returnerer formentlig:
navn-på-jar-fil!navn-på-fil
Avatar billede arne_v Ekspert
06. august 2003 - 10:17 #2
Du har formentligt overvejet workaround: distribuer truststore i jar-fil,
lad dine applikation teste for om den er på disk og hvis ikke, så skrive den til disk inden SSL socket åbnes.
Avatar billede trp79 Nybegynder
06. august 2003 - 10:29 #3
Den brokker sig hvis jeg prøver med openStream, dvs setProperty vil have "setProperty(java.lang.String,java.lang.String)".

Hvis du mener at workaround er: hvis filen ikke findes i sammen dir som prog(jar), så hent den ud fra jar fil og skriv til dir. Så må det blive min løsning. Jeg har ikke hørt workaround begrebet(eller hvad det nu er) før.
Avatar billede arne_v Ekspert
06. august 2003 - 10:34 #4
Ja. Problemet er at selvom SSLSocket skal bruge en stream, så skal du
bruge en string.

Workaround er er udtryk man bruger en del ihvertfald nogen steder til
at beskrive en løsning der ikke løser det egentlig eproblem men som ved
at gøre tingene lidt anderledes gør at man kan komme videre.

"arbejde uden om problemet"
Avatar billede trp79 Nybegynder
06. august 2003 - 11:13 #5
Okey :o)
Nu er jeg så selvfølgelig stødt ind i nye problemer.... jeg kan ikke helt få programmet til at hente filen ud af jar-filen (kopiere den). Jeg har forsøgt med:

if((new File("settings\\truststore.dat")).exists()){//findes truststore.dat i settingsbiblioteket
}//Gør ingen ting.
else{
    try{
        File myFile = new File(getClass().getResource("settings\\truststore.dat").toString());
        FileInputStream is = new FileInputStream(myFile);
        byte[] contents = new byte[is.available()];
        is.read(contents);
        is.close();
        if (contents!=null)
        {
            File aCopy = new File("settings\\truststore.dat");
            FileOutputStream os = new FileOutputStream(aCopy);
            os.write(contents);
            os.close();
        }
        else{System.out.println("truststore.dat indeholder ingen data!");}
    }
    catch(Exception e){System.out.println("Fejl under backup: "+e);}
}

Det compiler fint nok, men filen bliver bare ikke kopieret :o(
Jeg har formodninger om at det er i forbindelse med File myFile = new File(getClass()..... der er problemer. Men jeg har bare ingen ide om hvad det er..
Hiver jeg fat i truststore i jar filen på den helt forkerte måde?
Avatar billede arne_v Ekspert
06. august 2003 - 11:23 #6
Prøv og erstat:

File myFile = new File(getClass().getResource("settings\\truststore.dat").toString());
FileInputStream is = new FileInputStream(myFile);

med:

InputStream is = getClass().getResource("settings\\truststore.dat").openStream();
Avatar billede trp79 Nybegynder
06. august 2003 - 12:02 #7
Nej den kopierer stadig ingen ting :o( Men kompilerer fint.
Jeg er helt blank, du har vel ikke et par ideer?
Avatar billede arne_v Ekspert
06. august 2003 - 12:16 #8
Ups.

InputStream is = getClass().getResource("settings/truststore.dat").openStream();

slash Unix way ikke PC way.
Avatar billede trp79 Nybegynder
06. august 2003 - 12:57 #9
Jeg er så PC way, så jeg fatter ikke at det ikke virker.

Her er lige lidt om opbygningen af jar filen:
test.jar
-Meta-inf
-ssl
    -keystore.dat
    -truststore.dat
..
..
diverse class's

Mit kald ser således ud (og sker i construktoren):
        m.tjekForSSLFil("truststore.dat");
        m.tjekForSSLFil("keystore.dat");

Min metode ser således ud (anden fil derfor instancen m i metode kaldene):

public void tjekForSSLFil(String filnavn)
{
    if((new File("settings\\"+filnavn)).exists()){//findes fil i settings-biblioteket (uden for jar-fil)
        }//Gør ingen ting.
    else{
        try{
                InputStream is = getClass().getResource("ssl\\"+filnavn).openStream();    //indlæsning af fil fra jar-fil
                byte[] contents = new byte[is.available()];
                is.read(contents);
                is.close();
                if (contents!=null)
                {
                    File aCopy = new File("settings\\"+filnavn);
                    FileOutputStream os = new FileOutputStream(aCopy);
                    os.write(contents);
                    os.close();
                }
                else{System.out.println("truststore.dat eller keystore.dat indeholder ingen data!");}
            }
            catch(Exception e){System.out.println("Fejl under kopering af filer (tjekForSSLFil()) ved brug af ssl i metoder.java: "+e);}
        }
}

Kan du se nogle fejl?
Avatar billede arne_v Ekspert
06. august 2003 - 14:00 #10
Ja.

getResource skal have filnavne Unix way. Også på PC.
Avatar billede trp79 Nybegynder
06. august 2003 - 16:18 #11
Okey, det så virkede koperingen :o)
Men den er ikke helt tilfreds med at man kopierer keystore.dat ud af filen. "Keystore was tampered with, or password was incorrect". Det er jo et sikkerheds hensyn, så det kan vel ikke overkomme :o(
Avatar billede arne_v Ekspert
06. august 2003 - 16:24 #12
Kan du lave et hex dump af filen før og efter ?

Det er sandsyneligvis bare et LF versus CRLF problem.
Avatar billede trp79 Nybegynder
06. august 2003 - 17:12 #13
Jeg er slet ikke med på hvad et hex dump af filen er og hvad et LF og CRLF problem er... Er det besværligt at løse problemet gennem et hex dump?
Avatar billede arne_v Ekspert
06. august 2003 - 17:14 #14
"hex dump" er at vise indholdet af filens bytes i hexadecimal.

Og det løser ikke problemet men kan enten af eller bekræfte
min hypotese om at filen er blever korrumperet p.g.a.
noget med at LF (0x0A) er blevet til CRLF (0x0D 0x0A)
fordi Java har troet at det var en tekst-fil.
Avatar billede arne_v Ekspert
06. august 2003 - 17:15 #15
Men da kan også være at du bare må krybe til korset og distribuere den
fil separat.
Avatar billede trp79 Nybegynder
06. august 2003 - 17:33 #16
Okey, jeg overgiver mig og distibuerer filen seperat.

Mange tak for hjælpen,
er du ikke lige flink og smide et svar? Nu har jeg jo lært hvordan jeg benytter ressourcer, som ligger i en jar fil. :o)
Avatar billede arne_v Ekspert
06. august 2003 - 17:46 #17
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