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

Labels (2)
Tags (1)
0 Kudos
1 Solution

Accepted Solutions
tfuchs
Elite Observer

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

Jump to solution

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

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

Jump to solution

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

0 Kudos
tfuchs
Elite Observer

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

Jump to solution

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
tfuchs
Elite Observer

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

Jump to solution

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
tfuchs
Elite Observer

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

Jump to solution

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