tfuchs
Elite Observer

Java-Klassen in Templates/Skripten verwenden im isolated-Modus

Jump to solution

Hallo zusammen,

wir stellen gerade auf isolated um und nachdem wir alle Module erfolgreich umgestellt haben, tauchen noch ein paar Probleme auf.

Es gibt ein paar Stellen, wo in Templates sowas hier verwendet wird:

$CMS_SET(set_JSON_parser, class("org.json.simple.parser.JSONParser").new())$

Und auch ein paar Stellen in Skripten, wo sowas gemacht wird:

import de.pinuts.XXXX.firstspirit.json.mediagallery.*;

parser = new MediaGalleryParser(context, jsonString, prefix, true);

Gibt es dazu eine einfache Lösung oder "müssen" wir alles umbauen? Ich habe schon probiert, eine PublicComponent daraus zu machen und dann ohne Paketnamen aufzurufen, aber das hilft nicht.

Danke und Grüße
Timo

0 Kudos
1 Solution

Accepted Solutions

So, ich habe nun auch das letzte Problem gelöst.

Das gradle Plugin definiert den Scope für die selbst erstellte Bibliothek pauschal immer als "module". Wenn man nun Teile seiner Funktionen als scope=server haben will, dann muss man:

1. Neues Subproject (in meinem Fall XXXPublicUtils) in gradle erstellen

2. Die Funktionen, die für scope=server benötigt werden, dorthin verschieben, in meinem Fall habe ich einfach das Paket de.pinuts.XXXX.firstspirit.json, in dem sich mein MediaGallery-Gedöns befindet komplett in dieses Subproject verschoben.

3. Das Subproject dann per fsServerCompile in der build.gradle in die Dependencies laden.

fsServerCompile project(':XXXPublicUtils')

View solution in original post

0 Kudos
4 Replies
tfuchs
Elite Observer

Ich merke gerade, in der Vorschau wird beides prima ausgeführt. Nur bei der Generierung leider nicht.

0 Kudos

Der Vollständigkeit halber: Bei der Generierung kommen die folgenden Fehlermeldungen:

ERROR 07.05.2020 13:55:13.372{g-node=249780} (de.espirit.firstspirit.generate.SiteProduction): java.lang.ClassNotFoundException: de.pinuts.XXXX.firstspirit.json.mediagallery.MediaGallery

Bzw.

ERROR 07.05.2020 13:02:43.037{g-sec=253386,g-node=249780,g-entity=Products(8896)} (de.espirit.firstspirit.generate.SiteProduction): java.lang.ClassNotFoundException: org.json.simple.parser.JSONParser

0 Kudos

Die Antwort scheint wohl zu sein, dass im Modul der Scope der Bibliothek auf "server" gestellt sein muss, also:

<resource name="com.googlecode.json-simple:json-simple" scope="server" mode="isolated" version="1.1.1" minVersion="1.1.1">lib/json-simple-1.1.1.jar</resource>

Ich verwende das FSM-Gradle-Plugin, dort habe ich es entsprechend in der build.gradle definiert:

fsServerCompile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'

Die Klasse MediaGallery kommt aber aus meinem Modul selbst, weiss jemand, wie man dafür definiert, dass der scope=server ist? Der Eintrag in der module.xml sieht ja so aus und wird vom gradle-Modul erstellt.

<resource name="de.pinuts.XXX.firstspirit:XXXUtils" version="4.0.2" scope="module" mode="isolated">lib/XXXUtils-4.0.2.jar</resource>

0 Kudos

So, ich habe nun auch das letzte Problem gelöst.

Das gradle Plugin definiert den Scope für die selbst erstellte Bibliothek pauschal immer als "module". Wenn man nun Teile seiner Funktionen als scope=server haben will, dann muss man:

1. Neues Subproject (in meinem Fall XXXPublicUtils) in gradle erstellen

2. Die Funktionen, die für scope=server benötigt werden, dorthin verschieben, in meinem Fall habe ich einfach das Paket de.pinuts.XXXX.firstspirit.json, in dem sich mein MediaGallery-Gedöns befindet komplett in dieses Subproject verschoben.

3. Das Subproject dann per fsServerCompile in der build.gradle in die Dependencies laden.

fsServerCompile project(':XXXPublicUtils')

0 Kudos