2016-06-08 22 views
1

Ich versuche, eine benutzerdefinierte Java-Komponente für zu erstellen. jedochNoClassDefFoundError mit einer benutzerdefinierten Java-Komponente in WCC

Es installiert currectly, wenn ich den Code ausführen, erhalte ich:
System code execution error. Unable to create service. java.lang.NoClassDefFoundError: com/lowes/content/edam/massMetaDataUpdate/service/ServiceApplication.

component.hda Datei sieht so aus:

<?hda version="11.1.1.8.0PSU-2015-01-08 07:49:21Z-r123144" jcharset="UTF8" encoding="utf-8"?> 
@Properties LocalData 
ComponentName=LowesMassMetadataUpdater 
blDateFormat=M/d{/yy}{ h:mm[:ss]{ a}}!mAM,PM!tAmerica/New_York 
classpath=$COMPONENT_DIR/classes 
hasPreferenceData=0 
libpath=$COMPONENT_DIR/libs 
preventAdditionalComponentDowngrade=0 
version=2016_06_08(build 1) 
@end 

Als Referenz der Anfang meiner Dienstklasse wie so aussieht:

Paket com.lowes.content.edam.massMetaDataUpdate.service;

import intradoc.server.Service; 

public class MMUService extends Service 
{ //this is the line that is throwing the error. 
    private ServiceApplication app = new ServiceApplication(); 

    /** Default Constructor - Does Nothing */ 
    public MMUService() { } 

    //rest of class omitted for brevity 
} 

Meine Komponente Start in der MMUService Klasse konfiguriert, die im selben Paket wie die Klasse ist, die nicht gefunden werden kann. Beide Klassendateien befinden sich direkt im selben Ordner. Warum also kann es die anfängliche Serviceklasse finden, aber keine enthaltene Hilfsklasse aus demselben Paket?


Erweiterte Build-Einstellungen von Component Wizard

Alle Blank ausgenommen:

Kundenspezifische Klasse Pfad:$COMPONENT_DIR/classes
Benutzerdefinierte Bibliothek Pfad:$COMPONENT_DIR/libs

Antwort

1

Für den Anfang , Würde ich ein verwenden ServiceHandler anstelle eines Service.

Stellen Sie sicher, dass Sie unter Build> Erweiterte Einstellungen eine Installations-ID haben.

Einige zusätzliche Lesung zu benutzerdefinierten Komponenten Gebäude sind hier zu finden:

+0

Warum ein ** ServiceHandler ** anstelle eines ** Service **? Ich erstelle eine Komponente, um eine hochgeladene Excel-Datei (kein eingechecktes Inhaltselement) aufzunehmen und den Inhalt der Datei zu verarbeiten, um eine Reihe von Metadaten-Aktualisierungen durchzuführen. 1 Update pro Zeile in der Datei. Der Dienst, den ich baue, soll den Großteil der Arbeit ausführen, die ich gerade beschrieben habe. – Raystorm

+0

'> Serviceklassen sind einfach zu erstellen, aber nicht sehr flexibel. Um es flexibler zu machen, benötigen wir ein ServiceHandler-Objekt. Eine Servicedefinition kann auf Methoden von nur einer Service-Klasse verweisen. Diese Dienstklasse kann jedoch so konfiguriert werden, dass mehrere Diensthandler vorhanden sind, sodass der Code in einem Diensthandler portabler ist und für Dienste freigegeben werden kann. Der Code ist fast genau der gleiche, aber es erfordert etwas mehr Konfiguration. –

+0

Gibt es ein bestimmtes Muster oder eine Namenskonvention, der die Installations-ID folgen soll? – Raystorm

0

ich in der Lage war, das Problem herauszufinden. Bevor die Anwendung die NoClassDefFoundError zeigte, wurde ein Protokollierungsfehler angezeigt. Dieser Fehler würde jedoch auf nachfolgenden Seiten Loads verschwinden.

Schaltet die Protokollierung Fehler aus:

System code execution error. Unable to create service. Exception type is 'java.lang.ExceptionInInitializerError'. 
Runtime error: org.apache.commons.logging.LogConfigurationException: 
       org.apache.commons.logging.LogConfigurationException: 
       org.apache.commons.logging.LogConfigurationException: 
       Class org.apache.commons.logging.impl.Jdk14Logger does not implement Log Runtime error: 
         org.apache.commons.logging.LogConfigurationException: 
         org.apache.commons.logging.LogConfigurationException: 
         Class org.apache.commons.logging.impl.Jdk14Logger does not implement Log Runtime error: 
          org.apache.commons.logging.LogConfigurationException: 
          Class org.apache.commons.logging.impl.Jdk14Logger does not implement Log 

die wirkliche Ursache für mein Problem war. Und wenn man es genauer betrachtet, wird deutlich, dass der Classloader im WCC eine andere Version von Apache Commons Logging lädt, als die Anwendung erwartet.

Das Update war eine Wrapper-Klasse von SystemUtils erstellen Log zu implementieren und dann die Systemeigenschaft org.apache.commons.logging.Log so, dass, wenn Klassen LogFactory.getLog(classname.class); rufen Sie werden Meine WCC Logger-Klasse erhalten und das gesamte Protokollierung Fehler Problem umgehen.