2016-01-17 7 views
9

Ich arbeite mit Alfresco Community 4.0.java.lang.NoClassDefFoundError: org/apache/chemie/opencmis/client/api/SessionFactory

Ich habe cmis verwendet, um ein Dokument in Alfresco zu aktualisieren.

Ich habe mich registriert bereits ein Dokument in Alfresco und das ist das Dokument-ID, die nach dem Speichern Methode abgerufen wird: b08e8bce-1b88-489e-a357-1e6385f180a1

Jetzt habe ich den Inhalt dieses ändern möchten Datei nach anderem Inhalt. Ich habe diese Methode:

public void saveVersioning(File file, String filename, String userName, String pwd, String docId) 
     throws Exception { 


     SessionFactory factory = SessionFactoryImpl.newInstance(); 
     Map<String, String> parameters = new HashMap<String, String>(); 

     // User credentials. 
     parameters.put(SessionParameter.USER,userName); 
     parameters.put(SessionParameter.PASSWORD, pwd); 

     // Connection settings. 
     parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value()); 

     parameters.put(SessionParameter.ATOMPUB_URL, "http://localhost:9080/alfresco/service/cmis"); // URL to your CMIS server. 

     // Create session. 
     // Alfresco only provides one repository. 
     Repository repository = factory.getRepositories(parameters).get(0); 

     Session session = repository.createSession(); 

     System.out.println("Connected to repository:" + session.getRepositoryInfo().getName()); 
     System.out.println("Repository id:"+session.getRepositoryInfo().getId()); 

     // Get the contents of the file 
     Document doc = (Document) session.getObject(docId); 
     ContentStream contentStream = doc.getContentStream(); // returns null if the document has no content 
     if (contentStream != null) { 


       String mimetype = "text/plain; charset=UTF-8"; 
       String content = ""; 

       if (contentStream != null) { 
        filename = contentStream.getFileName(); 
        mimetype = contentStream.getMimeType(); 
        content = getContentAsString(contentStream); 
        System.out.println("file name "+filename); 
        System.out.println("minetype "+mimetype); 
        System.out.println("content "+content); 
       } 



       String updatedContents = content + "\nLine added in new version"; 

       byte[] buf = updatedContents.getBytes("UTF-8"); 
       ByteArrayInputStream input = new ByteArrayInputStream(buf); 


       contentStream = session.getObjectFactory().createContentStream(
         filename, buf.length, mimetype, input); 



       System.out.println("Document version history"); 
       { 
        List<Document> versions = doc.getAllVersions(); 
        for (Document version : versions) { 
         System.out.println("\tname: " + version.getName()); 
         System.out.println("\tversion label: " + version.getVersionLabel()); 
         System.out.println("\tversion series id: " + version.getVersionSeriesId()); 
         System.out.println("\tchecked out by: " 
           + version.getVersionSeriesCheckedOutBy()); 
         System.out.println("\tchecked out id: " 
           + version.getVersionSeriesCheckedOutId()); 
         System.out.println("\tmajor version: " + version.isMajorVersion()); 
         System.out.println("\tlatest version: " + version.isLatestVersion()); 
         System.out.println("\tlatest major version: " + version.isLatestMajorVersion()); 
         System.out.println("\tcheckin comment: " + version.getCheckinComment()); 
         System.out.println("\tcontent length: " + version.getContentStreamLength() 
           + "\n"); 
        } 
       } 
      } 



    } 

Ich nenne diese Methode, um diesen Code verwenden:

File file = new File("C:/test.pdf"); 
     saveVersioning(file, "test.pdf", "admin","admin","b08e8bce-1b88-489e-a357-1e6385f180a1"); 

ich dieses Glas in meinem Java-Projekt verwendet:

enter image description here

Alle Gläser hinzugefügt werden zum Klassenpfad, aber wenn ich meine Anwendung teste, erhalte ich diesen Fehler:

Caused by: java.lang.NoClassDefFoundError: org/apache/chemistry/opencmis/client/api/SessionFactory 

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at com.sun.proxy.$Proxy24.sendTransfer(Unknown Source) 
    at 
    ... 111 more 
Caused by: java.lang.ClassNotFoundException: org.apache.chemistry.opencmis.client.api.SessionFactory 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    ... 124 more 

Mein Alfresco Community 4-Server enthält dieses Glas:

enter image description here

AKTUALISIERT:

Ich fand, dass mit Alfresco Community 4.0.0
sollte ich Chemie-opencmis-Client verwenden 0.6.0 und alfresco-opencmis-extension-0.2.jar

auch soll ich diese URL in meinem Code verwenden: http://localhost:9080/alfresco/cmisatom

ich ohne Erfolg versucht, die Sitzung mit CMIS mit diesem Code zu bekommen justen:

Map<String, String> parameter = new HashMap<String, String>(); 

// user credentials 
     parameter.put(SessionParameter.USER, "admin"); 
     parameter.put(SessionParameter.PASSWORD, "admin"); 

     // connection settings 
    parameter.put(SessionParameter.ATOMPUB_URL, "http://localhost:9080/alfresco/cmisatom"); 

    parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value()); 

    // create session 
    SessionFactory factory = SessionFactoryImpl.newInstance(); 
     Session session = factory.getRepositories(parameter).get(0).createSession(); 

als ich sagte, ich dieses Glas verwendet:

enter image description here

ich heruntergeladen alle lib aus der Chemie-opencmis-client-impl-0.6.0-mit-dependencies.tar.gz und ich heruntergeladen auch dieses Glas im Freien-opencmis-extension-0.2.jar

wenn ich testen, habe ich den gleichen Fehler.

Ich habe diese Zeile in meinem Code:

parameter.put(SessionParameter.OBJECT_FACTORY_CLASS, "org.alfresco.cmis.client.impl.AlfrescoObjectFactoryImpl"); 

Ich denke, dass das Problem der fehlenden Version von Glas und nicht im Zusammenhang mit meinem Java-Code verwendet ist, aber ich versuche ohne Erfolg, diese Linie zu ändern:

parameter.put(SessionParameter.ATOMPUB_URL, "http://localhost:9080/alfresco/cmisatom"); 

mit:

parameter.put(SessionParameter.ATOMPUB_URL, "http://localhost:9080/alfresco/service/cmis"); 
+0

Verwenden Sie Maven! Es wird "weniger komplizieren" Zeug :) XD –

Antwort

2

bin ich nicht sicher, ob dies th Die richtige Antwort, aber hoffentlich finden Sie den Fehler und einige Tipps.

  1. Zuerst laden Sie die latest CMIS Workbench oder die 0.6.0 version
  2. Verwenden Sie die Werkbank, um Ihre Alfresco um eine Verbindung zu überprüfen, ob alles funktioniert, z.B. erstellen/lesen/update/delete
  3. viel über CMIS lesen here und viele andere ..
  4. Bis Sie gelesen haben Sie wünschen würde, dass Sie als 4,0 auf einer höheren Version von Alfresco waren. Und wenn Sie eine stabile CMIS-Umgebung benötigen, sollten Sie auf 4.2.f oder höher aktualisieren.
  5. Graben Ihr aktuelles Java-Projekt und laden Sie die 0.6.0 mit frischen Abhängigkeiten von der Download-Seite
  6. zu dem Punkt, wo man ‚eigentlich‘ & speichern Dateien lesen kann.
  7. In Ihrem aktuellen Setup ist es nicht möglich, Dateien auf Alfresco zu speichern und nicht die NoClassDefFoundError und auf Update erhalten den Fehler. Entweder erhalten Sie den Fehler immer beim Build oder Sie erhalten einen weiteren Fehler.
  8. die session Bewegen und Session-Code auf einen gemeinsamen init() oder setupConnection() -Methode erstellen, so dass Sie doppelten Code nicht haben und damit mehr Chancen haben, Fehler zu machen
0

Ich gehe davon aus, dass Sie führen Sie Ihre Test mit einem anderen Klassenpfad zeigte dann auf den Screenshots.

Caused by: java.lang.ClassNotFoundException: org.apache.chemistry.opencmis.client.api.SessionFactory 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387) 

Sie führen Ihren Test in Tomcat-Container? Überprüfen Sie den Klassenpfad, wenn Sie den Test starten. Wenn classpath wirklich cmis-Abhängigkeiten hat, dann prüfe den cmis-Client-Versionskonflikt. Alle Konfliktversionen konnten mit maven (als Beispiel) leicht aufgelöst werden. Ich empfehle, ein Projekt als Maven-Projekt zu erstellen, um dieses Problem aufzuheben. Auch maven wird alle Cmis-Abhängigkeiten im Klassenpfad einschließen, wenn Sie test ausführen.