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.
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>
Added to maven central, so the library can be used without compiling it yourself