Substituindo o comportamento do servidor de aplicação para o carregamento JSP-api e servlet-api frascos num pedido Web, empacotado
-
11-07-2019 - |
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.
Solução
- Se você tem controle sobre o servidor onde pretende instalar este webapp você pode substituir os frascos de núcleo com o seu.
- 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:
- Executar em um servlet container que atende sua especificação servlet Atualizar seu aplicativo
- 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
- (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
modificadodiff 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