tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
326
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    KartoffelKiffer KartoffelKiffer ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    59
    Hallo,

    ich habe leider überhaupt keine Ahnung, wie ich folgendes Problem angehen könnte und bitte euch darum um Hilfe.

    Und zwar habe ich eine Funktion, die variabel erweitert werden soll.

    Diese Funktion fragt einen request ab (ist eine JEE-Anwendung), welchen Wert der Parameter "filter" beinhaltet.

    Dann wird sinngemäß entsprechend abgefragt

    Code :
    1
    2
    3
    4
    
    if (request.getParameter("filter").equals("tbl_index1"))
    {
    //mache
    }

    Diese Routine würde ich gerne auslagern. Sodass (z.B.) in einem bestimmten Verzeichnis x Dateien liegen, mit Namen tbl_index1.xxx und so weiter. Diese Dateien werden dann ausgelesen und der Code entsprechend eingefügt.

    Das Problem bei der Sache ist, dass ich in den "Subroutinen" auch mit Variablen aus der eigentlichen Funktion arbeiten muss.

    Ich möchte also in der Datei (z.B. tbl_index1) frei programmieren können, mit allen Variablen, die auch der Hauptfunktion zur Verfügung stehen.

    Lautet der "filter" nun nicht mehr tbl_index1, sondern tblAdressIndex, so wird eine Datei (und der entsprechende Code) tblAdressIndex.xxx geladen und ausgeführt.

    Das mag alles enorm bescheiden klingen, nur finde ich einfach keine richtigen Worte um das Problem besser zu beschreiben.

    Ich hoffe man kann mich halbwegs verstehen und ein paar entsprechende Schlagworte nennen.


    Grüße, KK
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    Hi

    ich nehme an, zwischen den einzelnen "//mache" wird es größere Unterschiede geben?
    Mach pro Möglichkeit eine eigene Java-Klasse in einer eigenen Datei,
    die bei Bedarf erzeugt (Reflection) und gestartet wird.

    Damit alle Klasse das selbe Schema haben (zB. eine Methode start mit xy Parametern)
    kommt noch ein Interface dazu, das jede Klasse implementiert.

    Zu den Variablen aus der Hauptmethode:
    Da gibts doch immer die selben Variablen, unabhängig von dem if-Zeug, oder?
    Übergib die Variablen einfach zu start (oder wie du es nennst).
    Wenns sehr viel sind, mach ein Objectarray oder so.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    KartoffelKiffer KartoffelKiffer ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    59
    Ich danke dir, Reflections waren das Mittel zum Zweck!

    Ich versuche nun zur Laufzeit mittels JavaCompiler eine Java-Datei zu übersetzen und einzubinden, danach invoke ich die noch unbekannte Methode. Allerdings beinhaltet diese Java-Datei (meine oben genannte .xxx-Datei) eine Zeile zum Importieren des Pakets javax.servlet.ServletRequest. Dieses Paket kennt der javac im jdk natürlich nicht.

    Wo müsste ich die servlet-api.jar wohl einspielen, damit der javac darauf zugreifen kann?

    Vielen Dank schon mal für die Hilfe!!

    edit: Hmpf

    Code :
    1
    
    private List<String> _options = Arrays.asList( "-d", "../webapps/ROOT/WEB-INF/classes", "-classpath", "../lib/servlet-api.jar");

    Sehr geil, es kann weiter gehen!
    Geändert von sheel (14.10.11 um 15:37 Uhr) Grund: Doppel
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    Dir ist aber schon klar, dass nicht jeder Computer mit Java auch einen Compiler hat!?

    Zum Jar: Classpath, Manifest, Jar mitgeben

    edit: Genau, dieser Classpath...
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    KartoffelKiffer KartoffelKiffer ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    59
    Das mit dem Compiler ist ok, wir liefern bei jeder Installation ein eigenes Java-Paket mit aus.

    Viel mehr bereitet mir gerade Sorgen, dass ich die Java-Datei zwar kompiliert bekomme, allerdings Änderungen daran nicht übernommen werden.

    Die class-Datei wird im Moment jedes Mal neu generiert, beim Start des Tomcat (ist wie gesagt eine JEE-Anwendung) ist die Klasse noch nicht bekannt, wird also generiert und eingebunden, sodass ein Zugriff per Reflection möglich ist.

    Nur wird bloß der erste Zustand der Datei verwendet, alle Änderungen verpuffen im Nirvana, bzw. werden erst wirksam, wenn die Webanwendung neu gestartet wird.

    Den aktuellen Quelltext habe ich aus diesem Beispiel in abgewandelter Form übernommen

    http://www.java-forum.org/codeschnip...enerieren.html

    Bei mir wird die java-Datei halt nicht zur Laufzeit generiert, sondern eine bestehende java-Datei kompiliert.
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    Hmm...weiß schon was du meinst, hab aber dafür selbst keine Lösung.
    Hab mit EE ziemlich wenig zu tun.
    Warten wir auf den Java-Guru...
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  7. #7
    Avatar von j2se
    j2se j2se ist offline Mitglied Silber
    Registriert seit
    Oct 2011
    Beiträge
    94
    Blog-Einträge
    1
    Zitat Zitat von KartoffelKiffer Beitrag anzeigen
    Die class-Datei wird im Moment jedes Mal neu generiert, beim Start des Tomcat (ist wie gesagt eine JEE-Anwendung) ist die Klasse noch nicht bekannt, wird also generiert und eingebunden, sodass ein Zugriff per Reflection möglich ist.

    Nur wird bloß der erste Zustand der Datei verwendet, alle Änderungen verpuffen im Nirvana, bzw. werden erst wirksam, wenn die Webanwendung neu gestartet wird.
    Hast Du Tomcat auch für das "hot deployment" konfiguriert? Hierzu genügt es, die Konfiguration für den Host auf autoDeploy="true" und deployOnStartup="false" zu setzen.
     

  8. #8
    SE Tutorials.de Gastzugang
    Soweit ich weis ist das so eine Macke des ClassLoaders. So lange deer ClassLoader einer bestimmten Klasse aktiv ist werden Änderungen ignoriert da die Klasse im RAM gehalten wird.
    Was man noch als work-around versuchen könnte wäre eine Wraper-Klasse die die eigentliche Hauptklasse über einen URLClassLoader läd und nach abarbeitung wieder entläd *Java7 : URLClassLoader.close()* ... aber ob das so auch mit Tomcat funktioniert weis ich nicht.
     

  9. #9
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Oder du nutzt einen anderen ClassLoader (Stichwort: Equinox/OSGi)
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  10. #10
    KartoffelKiffer KartoffelKiffer ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    59
    Hallo,

    erst mal danke für die zahlreiche Resonanz!

    Leider hat keiner der Tipps geholfen.

    Mein aktueller ClassLoader sieht wie folgt aus

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        URLClassLoader classLoader = null;
        public Class<?> getCompiledClass() throws ClassNotFoundException, MalformedURLException
        {
            URL url = new URL("file://" + file.getAbsolutePath());
            classLoader = new URLClassLoader(new URL[]{url}, getClass().getClassLoader() );
            return classLoader.loadClass(file.getName().replace(".java", ""));
        }
     
        public void close() throws IOException
        {
            classLoader.close();
            classLoader = null;
        }

    Ich verwende also schon den URLClassLoader.

    Der Tomcat ist auch so konfiguriert, wie oben vorgeschlagen, nur ebenfalls ohne Erfolg.

    Mit OSGi habe ich noch nicht gearbeitet, es wirkt anfangs allerdings exterm oversized für diese Problemstellung.
     

Ähnliche Themen

  1. "Plugins" für JavaScript erstellen (qooxdoo)
    Von Julian-w im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 02.01.10, 23:18
  2. Antworten: 3
    Letzter Beitrag: 15.04.09, 14:42
  3. Formular mit <input type="text"> erweitern bzw. entfernen
    Von nexdh im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 16.11.07, 15:44
  4. SQL Update: Feld um "2" erweitern?
    Von Hattrix im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 20.11.06, 09:01
  5. "plugins" für dieses Forum
    Von blubber im Forum PHP
    Antworten: 0
    Letzter Beitrag: 28.12.02, 16:18