mstaender
I'm new here

ClassNotFoundException in Executables bei Aufträgen

Hi,

ich habe heute beschlossen endlich ein paar Aufträge zu erstellen die regelmäßig Daten von einem externen Dienst abholen und in einer Datenquelle ablegen. Bisher habe ich dazu ein Beanshell-Skript verwendet das eine Executable aufruft. Aus dem SA heraus funktioniert das tadellos, also habe ich mir gedacht "ein Auftrag mit dem gleichen Skript wird sicher funktionieren".

Leider bekomme ich beim Ausführen jedoch CNF-Exceptions, z.B.

java.lang.ClassNotFoundException: javax.ws.rs.core.MediaType

Also habe ich zunächst nach Skripten in Aufträgen gesucht aber konnte nicht herausfinden, ob ich etwas besonderes bei der module.xml beachten muss.

Hier mein beeindruckendes Skript das ich im SA und dem Auftrag ausführe:

#!executable-class

UpdateTargetgroups Executable

Hier meine gekürzte module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module>

    <name>${project.artifactId}</name>

    <displayname>${display.name}</displayname>

    <version>${project.version}</version>

    <description>${module.description}</description>

    <vendor>${main.developer}</vendor>

    <components>

        <public>

            <name>UpdateTargetgroups Executable</name>

            <displayname>Update all target groups...</displayname>

            <class>....UpdateTargetgroupsExecutable</class>

        </public>

    </components>

    <resources>

        <resource scope="module">lib/javax.ws.rs-api-2.0.1.jar</resource>

        ...

    </resources>

</module>

In den JARS die ich einbinde sind die entsprechenden Klassen enthalten, ich habe mhier jetzt nur die ws.rs API eufgeführt, da diese entscheidend ist. Aus Verzweiflung habe ich den Resources-Block auch schon in den public Deskriptor kopiert aber auch das bringt nichts. Ich möchte die Resource wirklich nur im Modul bekanntgeben, daher denke ich, dass der Weg "Skript -> Executable -> Modulresourcen" eigentlich klappen sollte, auch vom Server-Environment aus.

Was mache ich denn falsch?

MfG Marcus

0 Kudos
10 Replies
thmarx
I'm new here

Hallo Markus,

verwendest du einen Sevice oder hast du die ganze Logik in dem Executable?

Das Problem mit dem Executable ist, dass es automatisch im scope server liegt und die benötigten Resourcen ebenfalls in diesem scope liegen müssen.

Das richtige Vorgehen wäre:

1. Erstelle eine ServiceInterface -> scope=server

2. Erstelle die Implementierung -> scope=module

3. In der Executable arbeitest du mit dem Interface

So sollte es funktionieren.

Gruß

Thorsten

0 Kudos

Hi Thorsten,

ich kann zwar deinen Ansatz nachvollziehen aber ich dachte genau das wäre der Witz bei Executables, also, dass diese Definition nach "außen" hin (public) von beliebiger Stelle aufgerufen werden können und alles was die Executable selbst aufruft geschieht im Modul selbst?

Das wäre jetzt ziemlich shclimm, ich habe einige Executables Smiley Sad

MfG Marcus

0 Kudos

Hallo Marcus,

da habe ich wohl etwas zu schnell geantwortet.

Du hast recht, eigentlich sollte es funktionieren. Die Resource in der die Klasse deiner Executable liegt, hat also scope auch module? Poste bitte mal deine komplette module.xml.

Gruß

Thorsten

0 Kudos

Hi Thorsten,

ich habe dir das Monster mal geschickt, da die meines Erachtens ziemlich lang ist und ich nicht wusste worauf du hinaus möchtest. Die Executable liegt in einer der als letzte genannten Resourcen und die sind alle mit Scope "module" versehen.

Sag mal, laut Doku (MDEV_DE_FirstSpirit_ModuleDeveloper.pdf Kapitel 2.5.1) müsste ich doch theoretisch auch ALLE JARs im lib-Verzeichnis einbinden können mit

<resource scope="module">lib/</resource>

aber wenn ich DAS statt den einzelnen JARs angebe fliegt mir schon das Modul beim Deployen um die Ohren Smiley Sad

Gibt es da einen Trick?

MfG Marcus

0 Kudos

Hallo Marcus,

deine module.xml sieht eigentlich ok aus. Evtl. handelt es sich hier um einen FS Bug, damit kannst du dich an unseren Technical Support wenden.
Alternativ kannst du es mit dem ServiceInterface machen, dass sollte auf jeden Fall funktionieren.

<resource scope="module">lib/</resource>

Das funktioniert nicht für Jars. In dem Ordner können zum Beispiel Medien/JS/CSS liegen, die du SA oder CC verwenden möchtest.

Gruß

Thorsten

mikula
Crownpeak employee

Hallo Markus,

benötigst Du noch weitere Hilfe oder haben Dir der Technical Support bzw. die Antworten von Thorsten bereits geholfen? In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Viele Grüße,

Martin

0 Kudos

Hi,

der Fall ist noch in Untersuchung. Ich lasse den Fall noch so lange als ungelöst stehen bis ich eine Antwort habe die ich mit euch teilen kann Smiley Happy

MfG Marcus

0 Kudos

Hallo Marcus,

ist der Fall nach wie vor in Untersuchung oder gibt es bereits neue Erkenntnisse?

Viele Grüße

Michaela

0 Kudos

Hi Michaela,

ich habe noch nichts weiter gehört aber deine Kollegen haben gesagt sie melden sich. Ich werde demnächst mal nachhaken. Daher ist der Fall noch offen.

MfG Marcus

0 Kudos