Hallo,
ich suche eine elegante Möglichkeit wie man gleiche Klassen gemeinsam auf dem Android(Client) und auf dem Server verwenden kann. Es gibt z.B. die Möglichkeit ein gemeinsames Package auf dem Server sowie Client einzubinden, gibt es sonst gute Möglichkeiten? Würde mich über Tipps freuen.
kommt auf dein System an, du kannst einfach einen extra Ordner für die Dateien machen und diese im Projekt verlinken (wenn du eclipse nutzt) oder mache sie als eine Lib und binde sie mit Maven ein
Erstmal danke für die Antwort!
Das heißt die Klassen werden in einem lokalen Maven-Repository verwaltet und Client sowie Server nutzen dann diese Klassen aus diesem, habe ich das so richtig verstanden?
Um maven verwenden zu können muss man einen Plugin in Eclipse installieren und diesen dann in Teilprojekte einbinden?
In unseren Projekten haben wir immer drei Projekte für Server/Client-Anwendungen. Ein Projekt für den Client und ein Projekt für den Server. In einem dritten Projekten haben wir dann alle Klassen die auf beiden Seiten genutzt werden können.
Ganz normal wie du es bei zwei Java-Anwendungen auch machen würdest. Bau ein JAR das in beiden Anwendungen enthalten ist. Das kann, muss aber nicht mit maven passieren. Ich denke das ist das was Swoop sagen wollte. Wenn du keine nicht verfügbaren JavaSE oder generell JavaEE Klassen verwendest ist das kein Problem. Bei Android einfach in den libs-Folder schieben und sie werden auch automatisch mit exportiert.
In Eclipse erstell einfach alle 3 Projekte in einem Workspace, dort kannst du sie dann bei den Project-Properties als Abhängigkeit angeben. Wenn du zusätzlich noch einen ant-Build hast musst du dort die JARs erstellen lassen und vielleicht noch entsprechend an die anderen Projekte ausliefern. Hier mache ich das z.B. beim prepare-oobe Task.
Wenn du anstatt des JARs im libs-Folder nur die Eclipse-Abhängigkeit verwendest musst du es bei den Build-Path-Properties aber extra noch exportieren lassen. Sonst stirbt die App wegen ClassNotFoundExceptions.
Hallo,
ich bekomme tatsächlich doch noch eine java.lang.ClassNotFoundException obwohl ich dacht, dass ich alles berücksichtig habe.
habe bei den beiden Projekten Client und Server bei Properties/java Build Path/Projects den Shared Project mit add hinzugefügt und auch bei Project References die Project gegenseitig vermerkt. Bei dem Shared Project habe ich bei java Build Path/Order and Export alles markiert, trotzdem bekomme ich die Exeption, was mache ich falsch?
Du musst nicht im Shared Project auf Export gehen sondern im Android-Projekt unter den Abhängigkeiten bei der SharedProject-Abhängigkeit Export aktivieren. Dann kommen die Klassen mit.
Mal von Android abgesehen, kann ich den Servlet mit einem Tomcatserver in einem Projekt nicht starten da eine Klasse die in einem anderen Projekt liegt und nicht gefunden wird. Ich weiss nich woran es liegen kann, habe alles so gemacht wie schlingel das gesagt hat und zwar habe ich erstmal zwei Projekte:
Projekt Server und Projekt SharedProjekt
In dem Server Projekt habe ich bei Properties/Buildpath/Projects den Shared Projekt hinzugefügt bei dem Server Projekt unter Properties/Buildpath/Order and Export den Shared Projekt mit einem Hacken vermerkt.
Nun starte ich den server und es kommt eine java.lang.NoClassDefFoundError der Klasse die in Shared Projekt liegt. Was kann man da noch machen bin langsam am verzweifeln
Nun starte ich den server und es kommt eine java.lang.NoClassDefFoundError der Klasse die in Shared Projekt liegt. Was kann man da noch machen bin langsam am verzweifeln
Wie startest du den Server? Kompiliert der vielleicht ein WAR zusammen dem dann die genannten Klassen fehlen? Wie erstellst du denn den Server?
Ich starte Servlet mit der rechten Maustaste auf die Klasse und dann der Option Run As - Run on Server und danach kommt folgender Fehler zum Vorschein:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Error instantiating servlet class com.example.web.webprojekt.webServlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
root cause
java.lang.NoClassDefFoundError: LcsvPackage/CSVConverter;
java.lang.Class.getDeclaredFields0(Native Method)
java.lang.Class.privateGetDeclaredFields(Unknown Source)
java.lang.Class.getDeclaredFields(Unknown Source)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
wie kann man diesen Fehler beheben?
*** Edit ***
Okay ich habe wohl den fehler gefunden und zwar sollten in diesem Fall diese Schritte ausgeführt werden. Habe die Anleitung irgendwo im Internet gefunden:
1.After attaching the project to the Tomcat server, double click the Tomcat v6.0 Server at localhost to popup theTomcat server configuration window.
2.Click General Information->Open launch configuration
3.Select Classpath tab
4.Highlight User Entries (buttons will become enabled)
5.Click Add projects… button
6.Check the boxes of the projects you want to include.
7.Click ok….ok….etc
Danach startet der Server ohne Fehlermeldungen.
Danke dir Schlingel für deine Mühe, hat mich auf jeden Fall weiter gebracht!
Gruß
*** Edit ***
Oooh nein, jetzt gibt es mit Server kein Problem dafür aber mit Android. Wie gesagt folgedes habe ich erledigt:
In dem Client Projekt habe ich bei Properties/Buildpath/Projects den Shared Projekt hinzugefügt bei dem Cleint Projekt unter Properties/Buildpath/Order and Export den Shared Projekt mit einem Hacken vermerkt.
Android Emulator startet auch ganz Normal ohne Probleme bis zu dem Zeitpunk, bis man auf einen Button Klickt und die Klasse aus dem Shared Projekt ins Spiel kommt. Die App stürzt ab und es kommt eine „AndroidRuntime - java.lang.NoClassDefFoundError: tabellenPackage.Table“. Wieso das, ich habe doch wohl alles nötige gemacht, oder doch was vergessen?
JavaFan ich weiß nicht was du machst, einfach bei Android und beim Server im BuildPath sagen Add Project, Projekt auswählen und das wars. Nichts anderes einstellen sollte ausreichen.
Ich finde es einfacher, wenn man die Jars verwendet und bei Änderungen immer nur das Jar neu erzeugt und austauscht. Ist zwar aufwändiger machts aber meiner Meinung nach einfacher!
Ja wahrscheinlich wäre das einfacher aber ich würde trotzdem mal gerne rausfinden wo das Problem liegt. Sowie ich das jetzt verstanden habe die Klassen aus dem Shared Projekt kommen ohne Probleme mit nach dem ich die Tipps oben befolgt habe. Das Problem liegt nur in einer Klasse die erweitert wird
public class Table extends AbstractTableModel {
Es ist so bei der Installation der apk erscheint im LogCat folgende Meldung:
unable to resolve superclass of …, link of class … failed
Alle anderen Klassen werden mitgenommen nur diese nicht, die erweitert wird
Hmmm ich müsste mal gucken ob ich das nachstellen kann, weil aktuell hab ich nur noch Android Libs
Aber eigentlich kann ich das auf diesem Weg immer Problemlos zusammen packen
Möchte mich hier mal einklinken. Ich versuche gerade sowas ähnliches:
Habe ein Projekt in dem meine Pojos liegen und die möchte ich auf dem Server und auf einem Android Client benutzen. Alles Maven Projekte.
Sobald ich in Android auf meine Pojo zugreif einfach über new MyPojo ()
Bekomme ich eine java.lang.TypeNotPresentException: Type, was soviel heißt wie Klasse nicht gefunden. Muss ich noch was einstellen?
EDIT:
Das andere Projekt ist ein ganz normales Maven Java 1.7 Projekt? Kann das ein Problem sein? Brauch Andorid was spezielles um Klassen zu importieren?
habe das gleiche Problem. Bei mir sind es die Klassen die für die Netwerk-Komunikation zuständig sind.
Normales hinzufügen des Projekte funktionierte nicht, inkl. sämtlicher Haken für Abhängigkeiten. Anschließend habe ich die JARs direkt importiert - also nicht mehr das reine Eclipse-Projekt. Auch hier funktionierte es nicht. Ich bin an der Stelle sogar soweit zum Schluss gekommen das er die JARs mit genommen hat, aber in den JARs war keine classes.dex enthalten. In der androidv4.jar (oder wie sie heißt) ist die classes.dex enthalten gewesen.
Zum Schluss habe ich die einzelnen Klassen direkt ins Projekt kopiert :twisted: