Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

1

18.05.2014, 15:07

[gelöst] Libgdx import external Problem (Kryonet)

Da melde ich mich auch mal wieder mit einer Frage,
Ich habe ein Libgdx Projekt unter Eclipse zum laufen gekriegt. Jetzt möchte ich gerne mit Kryonet Netzwerkfunktionalität hinzufügen. Getrennt voneinander läuft beides ohne Probleme. Ich kriege Kryonet jedoch nicht in das Libgdx Projekt. Ich habe schon einiges probiert und eine Menge gegooglet, aber anscheinend bin ich der einzige der dieses Problem zu haben scheint.
Das Problem ist, der Kryonet Namespace wird nicht gefunden. Füge ich Kryonet als Projekt im BuildPath hinzu, macht Eclipse erst mal keinen Stress, bis ich dann die Anwendung übersetzen möchte. Es gibt eine Exception die mir mitteilt, dass der Namespace nicht gefunden wurde. Ich habe das Kryonet als Jar exportiert und versucht hinzuzufügen, selbes Problem. Füge ich das Projekt als zip-Archiv, so wie ich es geladen habe hinzu tut sich auch nichts. Im Core Projekt von Libgdx habe ich in der build.gradle versucht die Abhängigkeit hinzuzufügen. Ich muss zugeben, für das externe Projekt ist mir das nicht gelungen, für jars habe ich zumindest schon mal gefunden wie man sie hinzufügt. Ein von mir getestetes Setup:
Kryonet als Lib exportieren, im Core-Projekt einen Ordner libs anlegen, in diesen Ordner die Jar kopieren. Meine build.gradle sieht so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
apply plugin: "java"

dependencies {
    compile files('libs/kryonet.jar')
}

sourceCompatibility = 1.6

sourceSets.main.java.srcDirs = [ "src/" ]

eclipse.project {
    name = appName + "-core"
}


Ich habe es auch mit fileTree('libs') versucht, hilft auch nicht. Bei diesem Setup möchte er zusätzlich einen Classes Ordner haben, gebe ich ihm den, meckert er trotzdem. Ich denke mein Problem ist dass Gradle für mich völlig neu ist. Mich ärgert es schon, dass man darauf angewiesen. Wisst ihr was ich falsch mache? Habt ihr schon selbst Libs unter Gradle Projekten zum laufen gekriegt? Am einfachsten wäre es wenn ich Kryonet einfach als Projekt in die Abhängigkeiten hauen könnte. Bis jetzt habe ich das ganze nur als Desktop Anwendung getestet. Soweit ich gelesen habe macht eine Libgdx Android Anwendung da noch mehr stress, obwohl Kryonet ohne Probleme unter Android laufen sollte.
Hoffentlich könnt ihr helfen.

Liebe Grüße,
Schorsch



edit:
Mir ist aufgefallen dass ich mit der falschen build.gradle gearbeitet habe. Ich habe die ganze Zeit die im Core Projekt bearbeitet. Es gibt noch ein weiteres Projekt ohne Suffix am Ende. Dort sind auch vorher schon viel mehr Informationen als in den anderen gradle.builds.
Dieses Projekt hat nun kryonet als lib im BuildPath. In der build.gradle ist die lib auch angegeben durch:

Quellcode

1
2
3
4
dependencies {
        compile files('libs/kryonet-2.18.jar')
        compile "com.badlogicgames.gdx:gdx:$gdxVersion"
    }

Wobei hier die untere Zeile schon vorhanden war. Jetzt gibts einen neuen Fehler. Stehe absolut auf dem Schlauch. Google rückt hier auch nichts mehr raus.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/io/ByteBufferInputStream
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
Caused by: java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/io/ByteBufferInputStream
    at com.esotericsoftware.kryonet.Server.<init>(Server.java:90)
    at com.esotericsoftware.kryonet.Server.<init>(Server.java:72)
    at com.mygdx.game.GameAldan.create(GameAldan.java:18)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:136)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
Caused by: java.lang.ClassNotFoundException: com.esotericsoftware.kryo.io.ByteBufferInputStream
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 5 more


Ich bin überfragt. Warum findet er die Klassendefinition nicht und was bleibt mir über um das Problem zu lösen? Füge ich die Jar dem BuildPath eines normalen (nicht gradle) Projektes hinzu so macht das ganze keine Probleme. Hoffentlich wisst ihr Hilfe:)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Schorsch« (19.05.2014, 19:46)


Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

19.05.2014, 19:53

Nach einiger Suche habe ich es nun doch geschafft. Bibliotheken wurden von mir in einen Ordner "libs" gesteckt. Beim "Core"-Projekt habe ich diese Bibliotheken im BuildPath angegeben. Das Projekt ohne Suffix (also nicht Name-Desktop, Name-Android, Name-Core, etc) muss jetzt noch genauer konfiguriert werden. Hierfür habe ich in der build.gradle den "libs" Ordner bekannt gemacht. Im "Core"-Projekt liegt der Code der auf die Bibliotheken zugreifen soll, also habe im im Abschnitt für das "Core"-Projekt unter "dependencies" den jeweiligen Ordner bekannt gemacht:

build.gradle:

Quellcode

1
2
3
4
5
6
7
8
9
// ........
project(":core") {
// ........
    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
        // ........
    }
}
// ........


Im Prinzip sagt diese Zeile Gradle, dass er alle Dateien der Endung "jar" im Unterordner "libs" mit kompilieren soll. Hier könnte man auch direkt einzelne Libs oder ganze Projekte angeben.

Vielleicht hilfts ja mal weiter.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“