relativen pfad aus einer .jar angeben

JavaFX und die Programmierung

Moderator: wegus

Antworten
Mitch
Beiträge: 79
Registriert: 02.03.2010, 12:39

relativen pfad aus einer .jar angeben

Beitrag von Mitch » 13.01.2011, 11:47

Dieses Thema hatte ich schonmal als Problem hier aufgelistet, jedoch konnte mir da keiner helfen.

Daher versuch ichs einfach nochmal.

Folgende Problematik die ich lösen möchte.

Ich habe eine GUI erstellt. Diese soll auf eine Datenbank zugreifen, die auf einem Server liegt.
Die Server URL muss ich natürlich angeben. Dieses will ich aber nicht im Programm selber machen sondern über eine "externe" XML.
Das Auslesen funktioniert auch soweit, jedoch nur wenn ich die XML direkt mit in die jar einbinde.

Was ich also vorhabe:
mein Projekt liegt in dem Ordner "GUI". In diesem Ordner liegt der "lib" Ordner und die .jnlp und .jar Files.
Nun möchte ich in dem "GUI" Ordner eine XML Datei erstellen, die die ServerURL beinhaltet.
Der aufruf ist folgender:

Code: Alles auswählen

public class ReadConfig {

    public-read var serverUrl: String;
   def is:InputStream=new FileInputStream("./config.xml");

    public function processResults(): Void {
        try{
        def parser = PullParser {
                    documentType: PullParser.XML;
                    input: is;
                    onEvent: parseEventCallback
                };
        parser.parse();
        is.close();
        }catch (t:Throwable){
            IKT.INFO(t.getCause())

        }

    }

    def parseEventCallback = function(event: Event) {
                if (event.qname.name.equals("serverUrl") and event.type == (PullParser.TEXT)) {
                    serverUrl = event.text;
                }
            }
    public function getServerUrl():String {
        var returnValue:String;
        processResults();
        returnValue=serverUrl;
        return returnValue;

    }

}

var iktServerUrl:String = "ReadConfig{}.getServerUrl();
"def is" ist die Angabe des Pfades der xml Datei.

Wie muss ich das Angeben um eine XML auszulesen, die ausserhalb der .jar liegt.

Danke schonmal für die Hilfe
MfG

Mitch
Beiträge: 79
Registriert: 02.03.2010, 12:39

Re: relativen pfad aus einer .jar angeben

Beitrag von Mitch » 13.01.2011, 13:41

habe es nun so probiert:

Code: Alles auswählen

def is:InputStream=new FileInputStream("{System.getProperty("user.dir")}/config.xml");
Wenn ich das Projekt über Netbeans starte Funktioniert alles wunderbar.

Nun lass ich das Projekt von Netbeans signieren.
(Properties->Anwendung, hacken bei "selbssigniertes Jar" setzen)

Kopiere das Ganze dann auf ein anderes System und Starte es über die jnlp.
Das Programm startet. Beim aufruf von "System.getProperty("user.dir")" bekomme ich dann folgende Exceprion:
Exception Login function java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
Ich habe viel über Rechte setzen in verschiedenen Forem gelesen, finde jedoch keine Lösung.
Hat jemand vielleicht einen anderen Ansatz um auf den relativen Pfad zu kommen, ohne Probleme mit den Rechten zu bekommen oder kann mir jemand weiterhelfen, wie und wo ich die Entsprechenden Rechte setzen muss.

MfG

Benutzeravatar
arittner
Beiträge: 3229
Registriert: 05.08.2008, 07:20
Wohnort: Südniedersachsen
Kontaktdaten:

Re: relativen pfad aus einer .jar angeben

Beitrag von arittner » 14.01.2011, 07:17

Moin!

Für relative Pfade, gab es doch die __***__-Direktiven. Ich glaube __DIR___ - Schau mal per Google, im Kopf habe ich das nicht. Du musst diese Direktive direkt in der Zeichenkette haben, ist also so was wie ein Makro.

Beste Grüße,
Josch.
JNBB/BeanDev-Blog | Twitter@beandev
Bild
Sun Certified Specialist for NetBeans IDE

Mitch
Beiträge: 79
Registriert: 02.03.2010, 12:39

Re: relativen pfad aus einer .jar angeben

Beitrag von Mitch » 17.01.2011, 14:22

Danke für deine Antwort.
Ich habe nun ein wenig damit rumversucht, allerdings ohne erfolg.

Wenn ich __DIR__ Ausgeben lasse bekomme ich als ausgabe:

"jar:file:/I:/NetbeansProjekte/HECUI/dist/HECUI.jar!/de/ikt/energy/hecui/"

Nun habe ich versucht in den dist Ordner zu navigieren. Meines wissens nach funktioniert das mit "../", also:

"{__DIR__}../../../../config.xml"
und bekomme
Exception Login function java.lang.NullPointerException

Vielleicht eine Iddee?

MfG

Benutzeravatar
arittner
Beiträge: 3229
Registriert: 05.08.2008, 07:20
Wohnort: Südniedersachsen
Kontaktdaten:

Re: relativen pfad aus einer .jar angeben

Beitrag von arittner » 17.01.2011, 14:38

Moin!

Aber was willst Du im Dist-Ordner? Dort ist doch nichts relevantes. Der Dist-Ordner ist doch ein Ordner Deiner Entwicklungsumgebung. Ressourcen befinden sich entweder in Deinem JAR oder auf einem Server.

Wenn Du auf Ressourcen des Servers zugreifen willst, musst Du eine Codebase setzen. Im JNLP-File schreibst Du zum Beispiel:

Code: Alles auswählen

codebase="http://www.example.com/myapp/" 
Im JavaFX-Programm rufst Du dann die Eigenschaft so ab:

Code: Alles auswählen

var codebase = FX.getProperty("javafx.application.codebase");
Du kannst dann deine XML-Datei so erhalten (wenn diese im res-Unterordner liegt):

Code: Alles auswählen

var pathToXML = "${codebase}res/config.xml";
So. Jetzt möchtest Du benutzerdefinierte Dinge speichern. Dafür greifst Du überhaupt nicht auf lokale Dateien zu, sondern auf ein Storage. Das ist so was wie ein Super-Cookie, eine lokale Clientdatenbank. Damit umgehst Du die Security-Exceptions.

Beispiel:

Code: Alles auswählen

 import javafx.io.Storage;
 import javafx.io.Resource;
 import java.io.InputStream;

 var entry = Storage {
    source: "config.xml"
 }
 var resource = entry.resource;
 var inputstream = resource.openInputStream();
 // Hier nun das XML auslesen
 inputstream.close();
Da aber zunächst gar kein Storage existiert und Du das bei einer Installation nicht füllen kannst, musst Du immer ein Fallback haben. Am besten Du hast in Deinem JAR eine Standard config.xml die Du, wenn das Storage leer ist, dort hin kopierst.

Beste Grüße,
Josch.
JNBB/BeanDev-Blog | Twitter@beandev
Bild
Sun Certified Specialist for NetBeans IDE

Mitch
Beiträge: 79
Registriert: 02.03.2010, 12:39

Re: relativen pfad aus einer .jar angeben

Beitrag von Mitch » 19.01.2011, 08:16

Moin,

muss ich das
codebase="http://www.example.com/myapp/"
unter resources innerhalb der JNLP eintragen, oder wo genau?

Oder anders gefragt.
Kann ich die Server URL nicht direkt in die JNLP eintragen und auslesen? Das wäre im Grunde noch am einfachsten.

MfG

Benutzeravatar
arittner
Beiträge: 3229
Registriert: 05.08.2008, 07:20
Wohnort: Südniedersachsen
Kontaktdaten:

Re: relativen pfad aus einer .jar angeben

Beitrag von arittner » 20.01.2011, 08:20

Moin!

So könnte eine JNLP-Datei aussehen:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="file:/Users/username/Documents/localdirectory/RippleEffect/dist/" href="RippleEffect.jnlp">
  <information>
    <title>RippleEffect</title>
    <vendor>JavaFX Samples Team</vendor>
    <homepage href=""/>
    <description>RippleEffect</description>
    <offline-allowed/>
     <shortcut>
       <desktop/>
     </shortcut>
  </information>
  <resources>
   <j2se version="1.5+"/>
   <extension name="JavaFX Runtime" href="http://dl.javafx.com/1.3/javafx-rt.jnlp"/>
   <jar href="RippleEffect.jar" main="true"/>
  </resources>
  <application-desc main-class="rippleeffect.Main"></application-desc>
</jnlp>
Du musst je nach Distributionsweg die codebase festlegen.

Hier noch genauere Informationen zum Packaging von JavaFX Anwendungen:

http://download.oracle.com/javafx/1.3/t ... oy-applet/

Beste Grüße,
Josch.
JNBB/BeanDev-Blog | Twitter@beandev
Bild
Sun Certified Specialist for NetBeans IDE

Mitch
Beiträge: 79
Registriert: 02.03.2010, 12:39

Re: relativen pfad aus einer .jar angeben

Beitrag von Mitch » 07.02.2011, 16:13

Sorry, dass ich mich so spät erst wieder melde, allerdings hatte ich etwas andere Dinge zu tun und somit ist dieses Problem etwas nach hinten gestellt worden.

Bin allerdings immernoch nicht weitergekommen.
Aber was willst Du im Dist-Ordner? Dort ist doch nichts relevantes. Der Dist-Ordner ist doch ein Ordner Deiner Entwicklungsumgebung. Ressourcen befinden sich entweder in Deinem JAR oder auf einem Server.
Normalerweise schon. Allerdings sieht die jetzige Situation so aus, dass wir ein fertiges Jar-File haben, welches ich überall einsetzen möchte.
Da aber auf den verschiedenen Testumgebungen die Server URL nicht immer die selbe ist, möchte ich diese in einer Datei ausserhalb der jar eintragen und von dort aus auslesen.

Ob ich das direkt in die jnlp schreiben kann oder aber eine .xml benutze oder auch sons irgend einen Möglichkeit verwende spielt keine Rolle.

Wichtig ist nur, dass ich die jar erstellt habe und im grunde nicht wieder dran gehen kann/darf....!!

Und danke dir schonmal für die antworten. Wäre toll, wenn du eine Möglichkeit kennen würdest!

Mitch
Beiträge: 79
Registriert: 02.03.2010, 12:39

Re: relativen pfad aus einer .jar angeben

Beitrag von Mitch » 07.02.2011, 17:15

Hab soeben eine einfache möglichkeit gefunden:

In der fx Datei:

Code: Alles auswählen

var URLtoServer=FX.getArgument( "key" );
Nun muss ich in der JNLP nurnoch:

Code: Alles auswählen

<application-desc main-class="com.sun.javafx.runtime.main.Main" progress-class="com.javafx.progressbar.ProgressManager">
        <argument>MainJavaFXScript=neueklassen.urltest</argument>
<argument>key=Hugo</argument>

und siehe da Wenn ich URLtoServer ausgeben lasse steht Hugo drin!

Das war die leichteste Lösung die ich finden konnte
MfG

Antworten