Zum Hauptinhalt gehen

Unknown class Exception beim Aufruf von Executable-Class mit Map

Kommentare

6 Kommentare

  • Zendesk API User
    Author: mbergmann - 1/24/2016 12:21

    Hallo Dominik,

    ich vermute mal, dass Du die entsprechenden Klassen (=jars) in der module.xml als modul-lokal deklariert hast - was auch so empfohlen wird.

    Das führt dann allerdings dazu, dass diese Klassen in Beanshell-Skripten nicht gefunden werden, da diese nur Zugriff auf Server-globale resourcen haben.

    Was Du mal versuchen könntest:

    Falls noch nicht vorhanden, ein Script definieren, in dem die Klasse als executable-class benutzt wird:

    #!executable-class
    com.test.firstspirit.workflows.release.WfFindRelatedObjectsExecutable

    Wobei es hier übrigens besser ist, keinen FQCN zu nehmen sondern den Namen der entsprechenden <PUBLIC>-Komponente (dann kann man z.B. gefahrloser refactoren) - also z.B. ein Script "find_related_objects_executable" mit

    #!executable-class
    WfFindRelatedObjectsExecutable

    Und dazu passend die Deklaration in der module.xml:

    ...

    <public>

         <name>WfFindRelatedObjectsExecutable</name>

         <class>com.test.firstspirit.workflows.release.WfFindRelatedObjectsExecutable</class>

    </public>

    Im Script, das die Executable dann parametrisiert aufrufen soll, zuerst dieses Script-Objekt z.B. per StoreElementAgent holen und dann die Executable nicht instanziieren sondern aus dem Script holen:

    Script script = context.requireSpecialist(StoreElementAgent.TYPE)

         .loadStoreElement("find_related_objects_executable", Script.UID_TYPE, false);

    Executable executable = script.getExecutable(context.getProject().getTemplateSets().get(0));

    executable.execute(map);

    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: dhd - 1/25/2016 9:11

    Hallo Michael,

    danke für deine Hilfe. Die Klassen waren bereits als public in der Module.xml deklariert, weshalb es eben auch so komisch ist das er sie nicht findet. Allerdings konnte ich sie jetzt zumindest über deinen Weg mit dem StoreElementeAgent ermitteln und so weiter arbeiten.

    Danke und Gruß

    Dominik

    0
  • Zendesk API User
    Author: mbergmann - 1/25/2016 9:33

    Hallo Dominik,

    man muss hier zwischen der <public>-Komponente und ihren Resourcen (=Klassen) unterscheiden. Die Komponente ist sichtbar, obwohl ihre Klassen weiterhin im Module-Scope liegen. Dann muss man bei "manuellem" Zugriff aber auch diesen Mechanismus benutzen.

    Das "Entwicklerhandbuch für Komponenten" meint dazu in Kapitel "2.9.1.7 Public":

    Ausführbare Klassen: Ressourcen, die als Public-Komponente im Deskriptor eingebunden werden, können ausführbare Implementierungen enthalten. Nach der Installation des Moduls stehen diese ausführbaren Implementierungen auf dem FirstSpirit-Server zur Verfügung und können beispielsweise innerhalb eines Skripts (Auftrags-Skripte im FirstSpirit-Server oder Skripte im FirstSpirit SiteArchitect) aufgerufen werden. Um einen globalen Zugriff auf diese Dateien zu gewährleisten, musste für diese Ressourcen bisher (bis FirstSpirit Version 4.2R4/Build 4.2.434) ein serverweiter Gültigkeitsbereich definiert werden. Das ist nicht in allen Fällen erwünscht. Da beispielsweise Klassen aus global-definierten Jars keine Klassen aus modul-lokal definierten Jars verwenden können, mussten auch alle weiteren Ressourcen mit serverweitem Gültigkeitsbereich definiert werden (vgl. Gültigkeitsbereich von Ressourcen in Kapitel 2.5.1.2).

    Ab FirstSpirit Version 4.2R4 (Build 4.2.434) kann eine ausführbare Implementierung auch dann referenziert werden, wenn die Klasse in einem modullokalen Jar-Archiv liegt. Um Konflikte zu vermeiden, sollten alle Ressourcen (JarArchive), soweit das möglich ist, modul-lokal definiert werden.

    Darunter ist auch ein Beispiel hierfür mit module.xml und einem Script, das #!executable-class nutzt:

    Beispiel (Ressourcen werden mit modul-lokalem Gültigkeitsbereich definiert):

    <module>

         <name>Modul 1</name>

         <version>1.0</version>

         <components>

              <public>

                   <name>AppExecutor-Name</name>

                   <class>de.espirit.pm.modules.modul.AppExecutor</class>

              </public>

         </components>

         <resources>

              <resource scope='module'>lib/modul1.jar</resource>

              <resource scope='module'>lib/jtwitter_api.jar</resource>

         </resources>

    </module>



    Referenzierung der ausführbaren Klasse im Skript-Source-Tab:


    #!executable-class

    AppExecutor-Name

    //this calls class de.espirit.pm.modules.modul.AppExecutor registered in

    //"Module 1"


    Viele Grüße

    Michael

    0
  • Zendesk API User
    Author: dhd - 1/25/2016 9:42

    Hallo Michael,

    das Module spielte die Klassen aber auch bereits mit dem Scope Server aus.

    <resource scope="server">lib/zf.workflowsFSM.jar</resource>


    Gruß

    Dominik

    0
  • Zendesk API User
    Author: dhd - 1/25/2016 10:21

    Hallo Michael,

    mir ist gerade aufgefallen das in der Module.xml ein Buchstabendreher im schließen Tag von </resources> existierte. Somit wäre das Mysterium warum die Klasse nicht gefunden wurde auch gelöst. :smileyhappy:

    Dankte trotzdem für deine Hilfe.

    Gruß

    Dominik

    0
  • Zendesk API User
    Author: mbergmann - 1/25/2016 10:33

    Hallo Dominik,

    gerne :-)

    Wobei wie gesagt die Modul-lokale Variante immer vorzuziehen ist.

    Viele Grüße

    Michael

    0

Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.