ich habe einige TomcatProjekte und ein Java Funktions-Project, welche alle Funktionen enthält.
Wenn ich nun bei jedem TomcatProjekt im Build Path das Java Projekt adde, dann findet der zwar die benötigten Klassen im Classpath, allerdings sagt er immer "NoClassDefFoundError".
Zur Zeit erstelle ich jedesmal wenn ich im Java Project was ändere ein jar-File und speicher das im Tomcat Shared Libs folder ab, aber solange ich mich noch in der Develop-Phase befinde, würd ich das noch gerne anders machen.
Wenn ich stattdessen "Add Class Folder" mache, findet der alle Klassen und speichert die in "Referenced libraries" ab, aber wenn ich dadrauf klicke, sagt er
"Class File Editor: Source not found"
bei Plattformprojecten musst du in der plugin.xml die Jars hinzufügen über den Reiter 'Runtime', dort gibt es 'Classpath' und dort musst du dann die Jar adden. Ein einfachen 'Add to Build Path' gibt es da nicht.
Ich bin oben angefangen die ganzen Forenthemen durchzugucken, wo es reinkommt und hab mich vom Eclipse RCP und Co im Untertitel von Plattformprogrammierung beirren lassen.
Sorry Koringar, dass ich das Thema falsch eingestellt hab...
Auf keinen Fall solltest du deine App/jars in die TC Shared Libs rein, da haben sie nix zu suchen.
Allle Jars die deine WebApp braucht müssen unter WEB-INF/lib.
Du kannst in Eclipse auch angeben dass ein Projekt ein anderes Referenziert.
Erst hab ich das jar File aus dem Build Path entfernt.
Danach hab ich das gemacht, was du vorgeschlagen hast:
Build Path -> Configure Build Path -> Projects -> [Add...]
Dort habe ich das Projekt hinzugefügt.
Er findet alle benötigten Klassen im Build Path und ich kann ohne Fehler Tomcat starten und ausführen. Aber sobald eine Klasse aus dem referenziertem Projekt instanziiert wird, schmeißt er "NoClassDefFoundError". (An einer Stelle wo in Eclipse kein Error/Warnung angezeigt wird)
Dass ich das jar File im shared/libs folder gelegt hatte, hatte nur den Grund, dass ich es dann nur einmal ersetzen muss, wenn ich an den Funktionen was ändere, statt in allen WebApps ein neues jar File abzulegen.
Er findet alle benötigten Klassen im Build Path und ich kann ohne Fehler Tomcat starten und ausführen. Aber sobald eine Klasse aus dem referenziertem Projekt instanziiert wird, schmeißt er "NoClassDefFoundError". (An einer Stelle wo in Eclipse kein Error/Warnung angezeigt wird)
Du meinst wohl dass der Fehler erst im TC auftritt.
Das liegt daran dass TC die jars nicht findest, weil eclipse sie nicht ins WAR exportiert hat, sollte sich in den Projekteinstellungen regeln lassen (Project Proeprties -> Java Build PAth -> Order & Export).
Dass ich das jar File im shared/libs folder gelegt hatte, hatte nur den Grund, dass ich es dann nur einmal ersetzen muss, wenn ich an den Funktionen was ändere, statt in allen WebApps ein neues jar File abzulegen.
Das ist auch voll daneben imho
Was passiert wenn WebAppA die Version 1.0 von der lib braucht, WebAppB aber die Version 3.0?
IMHO brauchst du ein autom. Build Management, Ant, Maven2, etc. pp. können da helfen.
Die sorgen dann nämlich dafür dass jede WebApp die richtige Version mit ins War (also WEB-INF/lib) bekommt, beim build.
Nebenbei, mit OSGi könnte man das auch in den Griff bekommen, aber da gibt es noch andere Probleme mit OSGi & Webservern.
IMHO brauchst du ein autom. Build Management, Ant, Maven2, etc. pp. können da helfen.
Die sorgen dann nämlich dafür dass jede WebApp die richtige Version mit ins War (also WEB-INF/lib) bekommt, beim build.
Genau das brauch ich, und das werd ich jetzt angucken und auch machen
Aber um nochmals auf das Problem zu sprechen zu kommen.
Ich erstelle 'noch' keine WAR-files, sondern ich leg im Context Container von Tomcat (server.xml) Context Elemente an, die im Eclipse workspace liegen. Somit debugge ich doch meine WebApplikationen in Eclipse oder?
Es läuft ja noch alles lokal zu Testzwecken ab und wenn ich dann in Eclipse debugge, müsste der doch theoretisch auch auf Projekte referenzieren können, statt nur auf jar-Files?
Das Order&Export bezieht sich dann nur darauf, wenn ich wirklich ein WAR-file erstelle, also was aus Eclipse heraus exportiere?
Aber um nochmals auf das Problem zu sprechen zu kommen.
Ich erstelle 'noch' keine WAR-files, sondern ich leg im Context Container von Tomcat (server.xml) Context Elemente an, die im Eclipse workspace liegen. Somit debugge ich doch meine WebApplikationen in Eclipse oder?
Das ist nicht so schön, für solche Dinge gibt es die context.xml, dann braucht man nicht mehr am Server zu machen (ausser zB. JNDI Datasources).
Fürs debuggen ist deine Konfig auch sehr umständlich, das WTP (teil der JEE Disrto von Eclipse) kann das & viel mehr viel einfacher lösen
Das macht das was du machst automatisch, solltest aber nciht auf die Idee kommen diese Tomcatinstanz für Prod oder ähnliches zu nutzen.
Es läuft ja noch alles lokal zu Testzwecken ab und wenn ich dann in Eclipse debugge, müsste der doch theoretisch auch auf Projekte referenzieren können, statt nur auf jar-Files?
Mit Ant funktioniert alles super, danke für den Hinweis.
Ich hab jetzt auch alle KontextElement inner context.xml ausgelagert.
Ich hab aber noch 2 Fragen (ich wollte dafür jetzt nicht extra ein neues Thema aufmachen)
Wenn ich das Projekt als WAR-file in den webapps ordner aufn server lade, brauch ich mich um Kontext-Konfigurationen gar nicht mehr kümmern oder ?
Und jetzt das Wichtigerere...
Ich hab gestern(weil maki das erwähnt hatte ) alles aus shared/libs gelöscht, was da nicht reinsoll, unter anderem log4j.jar, da das eh in jedem webapp/lib ordner liegt.
Zuvor hatte ich immer folgende Fehlermeldungen (ausgelöst von Apache XML RPC Server), die mich aber nicht weiter störten, weil alles perfekt funktionierte und ich an den jars eh nichts geändert hab.
Code:
log4j:ERROR A "org.apache.log4j.RollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
log4j:ERROR [org.apache.catalina.loader.StandardClassLoader@1386918] whereas object of type
log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1386918
].
log4j:ERROR Could not instantiate appender named "FileAppender".
log4j:WARN No appenders could be found for logger (org.apache.xmlrpc.server.XmlRpcStreamServer).
log4j:WARN Please initialize the log4j system properly.
Jetzt sind alle Fehlermeldungen weg. (Wieso?)
Ich wundere mich deshalb, weil ich nirgendwo bei apache xml rpc log4j eingebunden hab und außerdem benutzen die commons-logging-1.1.jar.
Ich versteh da nicht soviel von, sorry... und hab auch absolut keine Idee wo ich danach suchen sollte...
Wenn die context.xml unter META-INF zu finden ist und der Tomcatmanager verwendet wird um die WebApp zu deployen, geht alles automatisch.
Wenn du das War manuell in webapps kopierst, musst du halt noch die kontextkonfig manuell an die richtige Stelle kopieren (zB. [c]conf/Catalina/localhost/NameDerWebapp.xml[/c].
Das Problem das du beschreibst hat etwas mit dem ClassLoader zu tun, Details fallen mir jetzt keine zu deinem Problem ein, aber ClassLoader Probleme sind häufig bei seltsamer KOnfiguration
Jedenfalls deutet die Fehlermeldung daraufhin, daslog4j nicht konfiguriert werden konnte und somit nicht benutzbar war.
Aber ich hab noch Probleme mit log4j. Ich möchte gerne, dass meine funktionen immer durch log4j geloggt werden aber die webapps optional auch. Muss ich dazu bei den functions.jar und bei allen webapps das gleiche log4j.properties file ablegen ? Ich mach das nämlich zur Zeit so, und ich könnt mir vorstellen dass das verkehrt ist...
Dass der oben genannte Fehler auftritt, kann das daran liegen, dass commons-logging automatisch log4j benutzt, wenn das zur Verfügung steht? Commons Logging - User Guide Punkt 3
...und dann meine Appender verkehrt konfiguriert sind?
Irgendwie funktioniert ja alles... aber es ist mit Sicherheit falsch aufgesetzt.
commons-logging ist ein echtes Problem.... solltest auf jedenfall nicht die Autodiscovery vom commons-logging einsetzen, die ist nämlich Schrott und führt zu ClassLoader Problermen ohne ende.. kannst ja mal nach "commons-logging classloader problem" googeln, ist aber kein schöner Anblick
Hab AutoDiscovery abgestellt und einfach SimpleLog genutzt und schon waren alle Fehlermeldungen weg. Kann jetzt auch log4j.jar und commons-logging.jar wieder in shared/lib legen und es funzt alles.
Danke maki!!!
Dann wär nur noch eine klitzekleine Frage, hab die gestern auch schon mal angekratzt...
Wenn meine Funktionsbibliothek eine eigene log4j.properties hat und meine WebApp auch und functions.jar referenziert wird von der App, welche log4j.properties wird dann genutzt? Die, die zuerst geladen wurde?
Wenn das so ist, ist es dann richtig den log4j.logger.<functions> mit in die log4j.properties der webapp reinzunehmen?
Hab AutoDiscovery abgestellt und einfach SimpleLog genutzt und schon waren alle Fehlermeldungen weg. Kann jetzt auch log4j.jar und commons-logging.jar wieder in shared/lib legen und es funzt alles.
Normalerweise würde man die [c]commons-logging.properties[/c] so konfigurieren, dass log4j als logging Implementierung genutzt wird.
Wenn meine Funktionsbibliothek eine eigene log4j.properties hat und meine WebApp auch und functions.jar referenziert wird von der App, welche log4j.properties wird dann genutzt? Die, die zuerst geladen wurde?
Ja, ich hatte ja noch diese Classloader Probleme weiter oben beschrieben.
Jetzt wo ich ein wenig Zeit gefunden hab, hab ich auch den Grund für das alles gefunden und hab auch in der commons-logging.properties auf Log4j umgestellt.
Problem war: Ich hatte zwar log4j.jar im WEB-INF/lib ordner, aber nicht commons-logging.jar. Die lag nur im tomcat/lib verzeichnis. Die wird da ja auch benötigt, allerdings hab ich die zusätzlich in den WEB-INF/lib Ordner kopiert und schon funktioniert alles wunderbar.