Überwiegenden Anwendungsserververhalten für das Laden JSP-Servlet-API und api Gläser in einer verpackten Webapplikation

StackOverflow https://stackoverflow.com/questions/325171

Frage

Ich habe ein Projekt gebaut und mit einer bestimmten Version von jsp-apiand Servlet-API-JAR-Dateien verpackt. Jetzt möchte ich diese Gläser geladen werden, wenn das Web-Projektes auf einem beliebigen Anwendungsserver zum Beispiel tomcat Bereitstellung von WAR, Weblogic etc.

Das Verhalten, das ich auf Kater gesehen haben ist, dass es gibt Nachrichten, die die verpackte Version dieser APIs sind nicht zusammen mit einer beleidigenden Klasse geladen.

Gibt es eine Möglichkeit, diese Server-Einstellungen oder Verhalten außer Kraft setzen könnte?

Meine Sorge ist, dass das Standardverhalten eines Servers lassen auf unterschiedliche Verhalten zulassen verschiedene Server oder sogar auf verschiedene Versionen derselben App-Server.

War es hilfreich?

Lösung

  1. Wenn Sie die Kontrolle über den Server, auf dem Sie das Webapp installieren möchten, können Sie die Kerngläser mit Ihnen ersetzen.
  2. Zusätzlich können Sie die Gläser in der Inbetriebnahme des App-Server voranstellen.

Update:

Wie für den zweiten Teil, müssen Sie die Startdatei des Anwendungsserver sich selbst ändern.

Ich habe keine Installation bei der Hand haben, sondern lässt im Verzeichnis $ YOUR_APPSERV / bin nehme es eine Reihe von Skripten (entweder .cmd oder .sh-Dateien) sind

Einige von ihnen die App-Server zu starten, einige andere Hilfe, um es zu konfigurieren.

Sie müssen einer von denen, modifizieren, so die Befehlszeile wie folgt aussehen:

(unter der Annahme einer Windows-Installation)

java -Xbootclasspath/p:c:\cutomjars\myJar.jar;customjars\myOtherJar.jar ..................... // the rest of the normal command line.

-bootclasspath / p prepends die Gläser an die App Classpath

-bootclasspath / a anhängt die Gläser an die App claspath

Mit dieser Option können Sie mit dem in den Gläsern angegeben in der JVM jede Klasse überschreiben, so dass Sie auch Ersatz java.lang.String wenn Sie wollen.

Das ist ein Ansatz. Leider -Xbootclasspath ist eine Option für Sun JVM (dh JRockit es nicht hat, noch die VM von IBM was auch immer sein Name ist)

Es war eine weitere Option, in dem Sie einen Ordner angeben, in der alle Erweiterungen sind. Außerdem gibt es ein ext im jre.

Nehmen Sie

einen tiefen Einblick in den Anwendungsserver Verzeichnis ist und herauszufinden, was jedes Skript für verwendet wird, ich bin mir ziemlich sicher, dass Sie es schaffen.

Hier ist eine weitere formale Erklärung dieses Themas: http: //java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html

Ich hoffe, es hilft.

BTW, verwende ich vor Jahren zu tun, das CORBA-Paket mit einer seeeehr alten Version substitue. So funktioniert das sicher.

Andere Tipps

Ich habe die Antwort in zwei für Klarheit geteilt

Tushu, ich habe zwei Nachrichten für Sie.

Die gute ist ich habe es geschafft, die Servlet-api 2,5-2,3 in meinem Kater mit den Schritten ersetzen ich Sie in meinem vorherigen Beitrag beschrieben habe (screeshots unten)

Der schlechte neue (und ich soll dieser vor erraten habe) Der Kater nicht start.That ist offensichtlich, der Servlet-api.jar ist der Kern des Katers und die Version hängt von einigen Funktionen dort vorhanden ist. Wenn es geändert wird, wird der Motor nicht funktionieren.

Die Lösung, die ich Sie habe zeigen, arbeitet das Verhalten von ein oder zwei Klassen zu ändern, aber nicht das gesamte System zu ersetzen.

So sind die einzigen Optionen, die Sie haben, sind:

  1. Ausführen auf einem Servlet-Container, der Servlet-Spezifikation erfüllt Rüsten Sie Ihre App
  2. Testen Sie es, wie es auf der neuen Spezifikation ist. Die Chancen stehen gut (und wenn Sie nicht auf nicht öffentliche Klassen verlinkt haben) Ihr App noch funktionieren
  3. (Ich tat dies in der Vergangenheit) mit genau den Klassen benötigt ein neues Glas erstellen (lassen Sie uns sagen, dass Ihre App eine Klasse muss nur gut laufen) und dann die Klasse, um den Behälter voranstellen.

Hier ist der Test jsp

Servlet version: <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%>

Ausgabe mit unmodifizierten Version:

unmodifizierte Version http://img89.imageshack.us/img89/9822/87694136ld9 .png

Modifizierte Version:

modifizierte Version http://img241.imageshack.us/img241/7842/86370197ev3 .png

Bildschirmfoto des modifizierten catalina Start

diff ouput http://img246.imageshack.us/img246/3333/30172332tp7 .png

Tomcat stacktrace

SEVERE: Servlet.service() for servlet jsp threw exception

javax.servlet.ServletException: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:275)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Thread.java:619)

JRockit kann -Xbootclasspath verwenden. Sehen Sie die Befehlszeilenreferenz

Andere Möglichkeit ist die Verwendung

  

-Djava.endorsed.dirs

Nach dem Start der JVM

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top