Substituindo o comportamento do servidor de aplicação para o carregamento JSP-api e servlet-api frascos num pedido Web, empacotado

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

Pergunta

Eu tenho um projeto construído e empacotado com uma versão específica de arquivos servlet-api jar jsp-apiand. Agora eu quero que esses frascos para ser carregado durante a implantação do projeto web em qualquer servidor de aplicação, por exemplo tomcat, FOI, Weblogic etc.

O comportamento que eu vi no tomcat é que dá mensagens que a versão embalada dessas APIs não são carregados juntamente com uma classe de ofender.

Existe alguma maneira eu poderia substituir estas definições ou o comportamento do servidor?

A minha preocupação é que deixar o comportamento padrão de um servidor pode permitir que um comportamento diferente em diferentes servidores ou mesmo em diferentes versões do mesmo servidor de aplicativos.

Foi útil?

Solução

  1. Se você tem controle sobre o servidor onde pretende instalar este webapp você pode substituir os frascos de núcleo com o seu.
  2. Além disso você pode preceder os frascos na inicialização do servidor de aplicativos.

Update:

Quanto à segunda parte, você precisa modificar o arquivo de inicialização do servidor de aplicativos que eu.

Eu não tenho uma instalação na mão, mas vamos supor que no dir $ YOUR_APPSERV / bin há um monte de scripts (quer .cmd ou arquivos .sh)

Alguns deles iniciar o servidor aplicativo algum outro tipo de ajuda para configurá-lo.

Você precisa modificar um daqueles de tal maneira a aparência da linha de comando como este:

(assumir uma instalação do Windows)

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

-bootclasspath / p prepends os frascos para o aplicativo classpath

-bootclasspath / a anexa a frascos para o aplicativo claspath

Esta opção permite-lhe substituir qualquer classe no JVM com as especificadas nos frascos, assim você pode até mesmo substituir java.lang.String se você quiser.

Essa é uma abordagem. Infelizmente -Xbootclasspath é uma opção para Sun JVM (isto é não JRockit não tem, nem o da IBM VM o que sempre seu nome é)

Não havia outra opção, onde você declarar uma pasta onde todas as extensões são. Além disso, há um diretório ext no JRE.

Tome um mergulho profundo em seu diretório bin servidor de aplicativos e descobrir o que cada script é usado para, eu tenho certeza que você vai passar por isso.

Aqui está uma explicação mais formal deste tópico: http: //java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html

Espero que ajude.

BTW, eu uso para fazer isso anos atrás, a substitue o pacote CORBA com uma versão veeeery idade. Então, isso funciona para certo.

Outras dicas

Eu dividir a resposta em duas para maior clareza

Tushu, tenho duas notícias para você.

O bom é que eu consegui substituir a api servlet 2,5-2,3 no meu tomcat utilizando os passos que descrevi você no meu post anterior (screeshots abaixo)

A má nova (e eu deveria ter imaginado isso antes) O tomcat não óbvio, o servlet-api.jar de start.That é o núcleo do tomcat, ea versão depende de algumas características presentes lá. Se ele for alterado, o motor não irá funcionar.

A solução que eu te mostrar, trabalha para mudar o comportamento de uma ou duas classes, mas não para substituir todo o sistema.

Assim, as únicas opções que você tem são:

  1. Executar em um servlet container que atende sua especificação servlet Atualizar seu aplicativo
  2. Test-lo como ele é na nova especificação. As possibilidades são (e se você não conectar-se a classes não públicas) a sua aplicação ainda trabalho
  3. (Eu fiz isso no passado) criar um novo frasco com exatamente as classes necessárias (digamos que a sua aplicação só precisa de uma classe para correr bem) e, em seguida, preceder essa classe para o recipiente.

Aqui está o teste jsp

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

Saída da versão não modificada:

versão não modificada http://img89.imageshack.us/img89/9822/87694136ld9 .png

Versão modificada:

versão modificada http://img241.imageshack.us/img241/7842/86370197ev3 .png

Captura de tela do catalina startup

modificado

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 pode usar -Xbootclasspath. Veja a comando linha de referência

Outra opção é usar

-Djava.endorsed.dirs

Ao JVM inicialização

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top