Hallo zusammen,
ich habe in der Vergangenheit schon das ein oder andere kleine Modul gebaut welche aber immer nur aus Executables, Plugins oder Providern bestand.
Hierfür habe ich auch immer nur die PUBLIC Komponente für den ModulDeskriptor genutzt.
Jetzt habe ich den Anwendungsfall das ich eine selbst geschriebene Klasse die eigentlich keine Verbindung zur FS API benötigt innerhalb von Templates oder Skripten verfügbar machen möchte.
Die Funktion der Klasse ist es PDFs und Office Dokumente über ein per Dependency eingebebundenen Apache-Tika-Parser zu parsen und den Text daraus zurück zu geben.
Ich will in den FS Templates die Klasse anhand dieser Anleitung nutzen könne: Re: Methode aus eigenem Modul in einer Vorlage aufrufen
Hallo,
du kannst die Klasse/Methode über
$CMS_VALUE(class("mein.package.Klasse").methode())$
bzw eine Instanz/Konstruktor über
$CMS_SET(class, class("mein.package.Klasse").new(...))$
$CMS_SET(class, class("mein.package.Klasse").instance(...))$
holen.
Laut Doku könnte man ja hierfür die LIBRARY Komponente verwenden, denn ich will nicht unbedingt aus meiner Klasse eine Executable machen.
Nun sieht meine module.xml so aus:
<?xml version="1.0" encoding="UTF-8"?>
<module>
<name>${project.name}</name>
<version>${project.version}_${module.build.timestamp}</version>
<description>${project.description}</description>
<vendor>${project.organization.name}</vendor>
<components>
<library>
<name>DocumentParser</name>
<resources>
<resource>lib/${project.artifactId}-${project.version}.jar</resource>
</resources>
</library>
</components>
<resources>
${module.resources.global.legacy}
</resources>
</module>
Und die POM.xml sieht so aus (ich nutzte die firstspirit-module-parent-pom für das bauen der .fsm (ich kenne zwar noch den Weg über ein selbst geschriebens Plugin, aber ich wollte an dieser Stelle mal den von e-Spirit vorgeschlagenen Weg austesten)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.xxx.firstspirit.module</groupId>
<artifactId>tika-document-parser</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Document Parser</name>
<description>Module to parse documents like pdf, docx, e.g.</description>
<parent>
<groupId>com.espirit.ps.maven</groupId>
<artifactId>firstspirit-module-parent-pom</artifactId>
<version>3.0.1</version>
</parent>
<properties>
<firstspirit.version>5.2.180909</firstspirit.version>
<tika.version>1.20</tika.version>
<module.build.timestamp>${maven.build.timestamp}</module.build.timestamp>
<maven.build.timestamp.format>yyyyMMdd-HHmmss</maven.build.timestamp.format>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>${tika.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>${tika.version}</version>
</dependency>
...
</dependencies>
</project>
Das Modul erzeugt ja beim maven build die .jar Datei für das Projekt mit folgenden Klassen und legt diese in den lib Ordner. Und genau diese erzeugte .jar verlinke ich dann in der LIBRARY Komponenten (Bitte Bescheid geben wenn ich hier einen Denkfehler habe).

Und die Impl Klasse sieht so aus, diese will ich dann auch in den Templates aufrufen können:
public class DocumentParserImpl {
private static final String ENCODING_UTF8 = "UTF-8";
public DocumentParserImpl() {}
public String testString() {
return "TEST from Module";
}
}
Folgener Aufruf ist z.b. in einem Skript oder RenderTemplate gewünscht (siehe oben).
$CMS_SET(set_return, class("de.package.DocumentParserImpl").testString())$
Nichts desto trotz erhalte ich folgende Fehlermeldung wenn ich das Modul dann installieren will.
FSVersion=5.2.180909.77696#5536;JDK=1.8.0_191 64bit Oracle Corporation;OS=Linux 3.10.0-957.1.3.el7.x86_64 amd64;Date=25.01.2019 11:58:44
java.io.FileNotFoundException: /home/oboeck/Dokumente/tika-document-parser-1.0.0-SNAPSHOT.fsm: resource 'lib/tika-document-parser-1.0.0-SNAPSHOT.jar' not found!
at de.espirit.firstspirit.module.descriptor.AbstractDescriptor$ResourceDescriptor.validate(AbstractDescriptor.java:670)
at de.espirit.firstspirit.module.descriptor.AbstractDescriptor.validate(AbstractDescriptor.java:184)
at de.espirit.firstspirit.module.descriptor.ModuleDescriptor.validate(ModuleDescriptor.java:220)
at de.espirit.firstspirit.server.module.ModuleManagerProxy$ClientModuleManager.checkModuleVersion(ModuleManagerProxy.java:322)
at de.espirit.firstspirit.admin.gui.ModuleConfigurationPanel$2.run(ModuleConfigurationPanel.java:345)
at java.lang.Thread.run(Thread.java:748)
Zusatz:
Wenn ich die module.xml so konfiguriere erhalte ich in FS immer ClassNotFoundExceptions wenn ich den DocumentParserImpl aufrufen möchte, also denke ich das man Public nur nehmen kann wenn man auch ein FS Interface o.ä. einbindet?
<?xml version="1.0" encoding="UTF-8"?>
<module>
<name>${project.name}</name>
<version>${project.version}_${module.build.timestamp}</version>
<description>${project.description}</description>
<vendor>${project.organization.name}</vendor>
<components>
<public>
<name>DocumentParser</name>
<class>de.xxx.firstspirit.module.documentparser.DocumentParserImpl</class>
</public>
</components>
<resources>
${module.resources.global.legacy}
</resources>
</module>
Vielen Dank für eure Hilfe, ich komm hier sonst irgendwie nicht weiter.
Vorschläge wie man es besser macht sind herzlich willkommen, das wissen habe ich mir aus einer Mischung aus Community Einträgen und Entwickler Doku zusammen gebastelt.
Olli