2016-01-17 4 views
9

Я работаю с сообществом Alfresco 4.0.java.lang.NoClassDefFoundError: org/apache/chemistry/opencmis/client/api/SessionFactory

Я использовал cmis, чтобы обновить документ в Alfresco.

Я уже зарегистрировал документ в Alfresco и это идентификатор документа, который извлекается после метода сохранения: b08e8bce-1b88-489e-a357-1e6385f180a1

Теперь я хочу, чтобы изменить содержание этого файл другим контентом. Я использовал этот метод:

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"); 
        } 
       } 
      } 



    } 

Я называю этот метод, используя этот код:

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

я использовал эту банку в моем проекте Java:

enter image description here

добавляет Все банки для класса, но когда я тестирую свое приложение, я получаю эту ошибку:

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 

Мой сервер Alfresco Community 4 содержит эту баночку:

enter image description here

ОБНОВЛЕНО:

Я обнаружил, что с Alfresco Community 4.0.0
я должен использовать химия-opencmis-клиент 0,6,0 и alfresco-opencmis-extension-0.2.jar

также следует использовать эту URL-адрес в моем коде: http://localhost:9080/alfresco/cmisatom

Я безуспешно пытался получить Juste сессии с КМИС, используя этот код:

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(); 

, как я сказал, что я использовал эту баночку:

enter image description here

Я скачал все экспромты из химии-opencmis-клиент-осущ-0.6.0-с-dependencies.tar.gz и я также загрузил эту баночку под открытым небом-opencmis-разгибания 0.2.jar

Когда я тестирую, у меня такая же ошибка.

Я добавил эту строку в своем коде:

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

Я думаю, что проблема связана с отсутствующей версией баночки и не связанно с моей Java коды , но я пытаюсь изменить без успеха этой линии:

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

с:

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

Использование Maven! Это будет «менее усложнять» материал :) XD –

ответ

2

Я не уверен, если это го правильный ответ, но, надеюсь, вы найдете ошибку и некоторые советы.

  1. Сначала загрузите latest CMIS Workbench или скачать 0.6.0 version
  2. Используйте верстак для подключения к Alfresco, чтобы проверить, все ли работает, например, создание/чтение/обновления/удаление
  3. Читайте много о КМИСЕ here и многих других ..
  4. К тому времени, когда вы читали вы хотите, что вы были на более высокую версию Alfresco, чем 4,0. И если вам нужна стабильная среда CMIS, вам следует перейти на 4.2.f или даже выше.
  5. Отключите ваш текущий проект Java и загрузите 0.6.0 с зависимостями, свежими со страницы загрузки.
  6. Подходите к точке, где вы можете «на самом деле» читать & сохранять файлы.
  7. В вашей текущей настройке невозможно сохранить файлы на Alfresco и не получить NoClassDefFoundError и при обновлении получить ошибку. Либо вы всегда получаете ошибку при сборке, либо получаете другую ошибку.
  8. Перемещение SessionFactory и создать код сеанса общего Init() или setupConnection() метод, так что вы не должны дублировать код и, таким образом, имеют больше шансов делать ошибки
0

я буду считать, что вы запускаете тест с другим classpath, который затем показал на скриншотах.

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

Вы проводите тест в контейнере tomcat? Перед запуском теста тщательно проверьте путь к классу. Если у classpath действительно есть зависимости cmis, проверьте конфликт клиентской версии cmis. Все конфликтующие версии могут быть разрешены maven (как пример) с легкостью. Я рекомендую создать проект как проект maven, чтобы аннулировать эту проблему. Кроме того, maven будет включать все cmis-зависимости в pathpath класса при запуске теста.