a-schild/nextcloud-java-api

Einbinden der Library

stony007de opened this issue · 15 comments

Hi
Ich habe NextCloud12 als Container im Docker laufen. Dabei würdet der default http Port auf 12321 gesetzt. Nun versuche ich die „nextcloud-Java-api“ in meinen (noch recht jungfräulichen) Code zu implementieren. Leider bislang ohne Erfolg.
Gibt es die Möglichkeit, eine kurze Beispiel Implementierung zu posten, anhand hervorgeht wie die Lib genutzt bzw. Angesprochen werden muss?

Danke im Voraus
Vg
Stephan

Look at the test code.
NextcloudConnectorTest.java

Ok, I have to say: I‘m new in Java.
My base is C++, C#, and Python. Now i‘ll try to build a cross-plattform App.
I think java is the best language for that.

So, like in other Languages i’ll Take the sources from git, an compiled it. In that case I took NetBeans, imported the ‘Nextcloud-Java-api’ and build a package. The result named “nextcloud-api-11.0.1-SNAPSHOT.jar”, I imported as library in a new Java Project with “import org.aarboard.nextcloud.api;”

If I do a simple copy’n past from your example to create a user.
Looks like:

package nc_api_1st_try;

import  org.aarboard.nextcloud.api.NextcloudConnector;

/**
 *
 * @author steins
 */
public class NC_API_1ST_TRY {
    private static final String TESTUSER = "testuser";


    private String serverName = "192.168.2.125";
    private String userName = "admin";
    private String password = "admin";
    
    private NextcloudConnector _nc;
    
     
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
         NC_API_1ST_TRY xxx = new NC_API_1ST_TRY();
        xxx.setUp();
         xxx._nc.createFolder("demo");
        
    }
    
    public void setUp() {
        _nc = new NextcloudConnector(serverName, false, 32768, userName, password); 
    }
    
}

updated the code

the result looks like that:

run: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpRequestBase at org.aarboard.nextcloud.api.provisioning.ProvisionConnector.<init>(ProvisionConnector.java:49) at org.aarboard.nextcloud.api.NextcloudConnector.<init>(NextcloudConnector.java:54) at nc_api_1st_try.NC_API_1ST_TRY.setUp(NC_API_1ST_TRY.java:38) at nc_api_1st_try.NC_API_1ST_TRY.main(NC_API_1ST_TRY.java:32) Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpRequestBase at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 4 more /Users/steins/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1 BUILD FAILED (total time: 0 seconds)

But it is’t work.
The “false” is set because, no https.
The 32768 is the working http port to the NC server
A little helping would be great...

Thx..

Hi Stephan,

verwendest Du ein Buildtool für den Bau? Maven oder gradle? Für mich sieht die Fehlermeldung so aus, als würden Dir noch Bibliotheken fehlen, welche von der nextcloud-java-api benötigt werden. Denn an sich sollte der Code funktionieren.

Gruß
Tobias

Hallo Stefan,

ich würde mal vorschlagen, dass du ein einfaches "Hello world" in Java zum laufen bringst, bevor es hier weiter gehen soll

Hi in einem "Hello World" muss nur kein zusatz "Kompiliert" werden! Ich versteh schon, dass der "Java-Dau" basic Fragen stellt. sorry möchte nur irgendwo ansetzten!
Ich lade das "nextcloud-java-api" in NetBeans und gebe ihm dann ein "Build with Dependencies".
Mit einem "Hello World" auf diesem Niveau wäre ich ja recht zufrieden!

Jetzt auch nochmal mit Screenshot wie meine Umgebung aussieht.
bildschirmfoto 2017-11-06 um 14 41 49

Ich würde davon ausgehen, dass die Library korrekt eingebunden ist, da der
"import org.aarboard.nextcloud.api.NextcloudConnector;"
richtig interpretiert wird.?

Anbei noch mein "Hello World"

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package hello_world;

/**
 *
 * @author steins
 */
public class Hello_World {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Hello_World Hello_World = new Hello_World();
        Hello_World.sayWhat("MyFirstTest");
    }
    
    
    private void sayWhat(String World) {
        
        // ausgeben
        System.out.println(World);
        
    }
}

Also ich bin nicht ganz weit draußen! ;-)

Ok,
wenn diese Hürde übersprungen wurde, dann die nächste ;)

Die NextCloud API benötigt einen ganzen Rattenschwanz von jar Dateien.
Je nach BUild Umgebung kannst du

  • das in der pom.xml Datei angeben (Emphohlene Variante)
  • oder dann eben alle manuell herunterladen und ins Projekt einbinden

Du findest die direkten Abhängigkeiten in der pom.xml der NextCloud API.
Diese jar's benötigen aber selbst auch wieder andere jars, das ist der Grund warum ich maven dazu empfehle

OK, dann heißt meine jetzige Hürde: "wtf is maven?".
Ich lese erst mal und gebe feedback!

So was Maven ist, hab ich nun. Aber ich bekomm es nicht gebacken, die abhängigen jar’s damit zu “extrahieren”. Die Abhängigkeiten in der pom sind recht übersichtlich. Sind das wirklich nur 3? Du sprachst von einem “..ganzen Rattenschwanz..”?

Um welche geht es denn dort, würde die auch manuell einbinden...
ist schon ein wenig deprimierend hier nicht weiter zu kommen

Diese drei Bibliotheken, die Du in der pom gefunden hast haben selbst wieder Abhängigkeiten, deshalb „Rattenschwanz“. Dürften wenn ich das richtig in Erinnerung hab mindestens 7-8 Bibliotheken sein, die Du manuell einbinden müsstest. Wenn Du Dich ein wenig in Maven eingelesen hast, solltest Du Dir für Dein Projekt selbst eine pom erstellen, mit der Du die nextcloud api einbindest, dann übernimmt Maven für Dich das ganze Dependency Management. Du musst dann erstmal auch nur die Nextcloud api in Deiner pom einbinden, die anderen holt sich Maven dann ja aus der pom von der Nextcloud api und dann wiederum aus den poms von dessen Dependencies, bis alle benötigten Bibliotheken eingebunden sind. Das schein vielleicht beim Einstieg etwas umständlich, aber wenn man mal ein Projekt hat, in dem viele verschiedene Bibliotheken benötigt werden, ist so ein Buil Management Tool unschlagbar.

somit sollte meine POM wie folgt aussehen?

<?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.demo</groupId>
    <artifactId>FirstMaven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <httpasyncclient.version>4.1.3</httpasyncclient.version>
        <commons-logging.version>1.1.1</commons-logging.version>
        <sardine.version>5.7</sardine.version>
        <netbeans.hint.license>gpl30</netbeans.hint.license>
    </properties>
    <name>Try to Implement the API</name>
    <url>http://www.google.de</url>
    
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
            <version>${httpasyncclient.version}</version>
        </dependency>
      
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commons-logging.version}</version>
        </dependency>
        
        <dependency>
          <groupId>com.github.lookfirst</groupId>
          <artifactId>sardine</artifactId>
          <version>${sardine.version}</version>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.aarboard.nextcloud</groupId>
            <artifactId>nextcloud-api</artifactId>
            <version>11.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

</project>

wenn ja, wo bekommt er die infos von der "nextcloud-api" her?

Sorry, ich bin in Maven nicht so fit, da ich gradle als Build Managment Tool verwende, aber ich bin mir ziemlich sicher, dass auch in Maven in Deiner pom nur die letzte dependency stehen muss, also die nextcloud api, die anderen werden ja als dependencies von der nextcloud api in deren pom gefunden.

allerdings musst Du die api jar vermutlich von einer lokalen Quelle einbinden, da sie nicht im offiziellen Maven Repository zu finden ist, könnte dann etwa wie folgt aussehen;

<dependency>
    <groupId>org.aarboard.nextcloud</groupId>
    <artifactId>nextcloud-api</artifactId>
    <version>11.0.1-SNAPSHOT</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath>
</dependency>

Here the whole dependency graph for the maven pom stuff.

2017-11-08 17_42_28-netbeans ide 8 2

Added to maven central, so the library can be used without compiling it yourself