Domanda

mi ha colpito su questo comportamento sgradevole su JBoss 4.2 in QA, e voglio stroncare sul nascere prima di andare in produzione e trovare qualche altro caso d'angolo.

Un jsp calles un metodo che ha avuto la seguente firma:

 public void methodName(String arg)

Questo è stato cambiato in:

 public void methodName(String arg, Object... args)

Un JSP preesistente chiamato questo metodo tramite:

 methodName("param");

Sulla distribuzione del codice modificato, JBoss non ricompilare il JSP e questo ha causato un incidente in QA. L'aggiunta di un commento sciocco jsp risolto il problema (JBoss ha riconosciuto che il JSP modificato e ricompilato esso).

È ci una regolazione su JBoss per forzare la ricompilazione di JSP al riavvio?

EDIT: Per chiarire alcuni punti della risposta, la messa a punto è che la JSP sono parte di una guerra che fa parte di un orecchio. L'orecchio ha tutte le classi in esso, in un barattolo.

Per quanto riguarda il desiderio di pre-compilazione, se il sistema non pensa che il jsp bisogno di compilazione, sarà pre-compilazione forza ricompilazione? Non sembra così. L'errore qui non è un errore di compliation, si tratta di un errore di chiamata di metodo a causa della "cambiata" (a livello di byte di codice, non proprio a livello di codice) firma del metodo.

Addendum: Si noti che abbiamo sperimentato nella produzione di recente che anche con la bandiera della risposta accettata impostare l'JSP non ricompilare, anche se il JSP ha nel cambiamento realtà. Bug importante lì, ma a prescindere, JBoss è stato arrestato normalmente. A questo punto è di arrivare a essere una vecchia versione di JBoss, ma se si sta ancora utilizzando esso, cancellando il contenuto del lavoro e tmp directory è l'unico modo per essere sicuri.

Non sto cambiando la risposta accettata semplicemente perché diventa veramente al punto di ciò che la questione stava cercando. bug JBoss sono una specie di una questione a parte.

È stato utile?

Soluzione

Se le JSP sono parte di una guerra che fa parte di un orecchio che viene distribuito come un barattolo, poi io non sono chiare perché JSP non vengono ricompilati. Non la JSP nel file di guerra hanno timestamp più recenti rispetto ai loro file di classe JBoss-compilati dall'ultima Deploy? In caso contrario, non si potrebbe toccare la JSP come parte della costruzione di WAR / EAR prima della distribuzione. [Mi riferisco a utilizzare il comando Unix "tocco", non manualmente toccando ogni file JSP.]

In alternativa, l'impostazione DeleteWorkDirOnContextDestroy a $ JBoss / server / default / deploy / jboss-web.deployer / META-INF / jboss-service.xml può essere quello che stai cercando. Si tratta di false per impostazione predefinita, ma l'impostazione a true può essere quello che ti serve. Penso che questo dovrebbe eliminare i file della classe le JSP su ridistribuire in modo che essi ottenere ricreati al momento del primo accesso di ogni JSP.

https://jira.jboss.org/jira/browse/JBAS-3358 per maggiori informazioni.

Altri suggerimenti

Non so di un ambiente, ma l'eliminazione del file di classe Java generato nella directory di lavoro dell'istanza JBoss farà sì che il JSP essere ricompilato la prossima volta che viene chiamato.

È scovare modificare gli script di avvio JBoss per eliminare in modo esplicito il "tmp" e / o directory "lavoro", in cui sono memorizzati i JSP compilati. JBoss avrebbe quindi avuto altra scelta che per ricompilare tutti.

Non è sottile, ma che avrebbe fatto il lavoro.

Una possibilità per voi sarebbe quella di precompilare tutti i jsp al momento della compilazione. Questo sarebbe rapidamente contrassegnare eventuali errori di compilazione.

Si potrebbe anche fare questo in produzione - ad accelerare primo accesso, ma ho la sensazione che si desidera che questo più per una fase di QA di ogni altra cosa. Se è così, si potrebbe aggiungere il passo precompilare al vostro fase di test nel vostro strumento di compilazione di scelta - e così al vostro ambiente CI. Ciò fornirebbe la garanzia che JSP di che non compilano non ce la farà da test.

Vedere questo per i dettagli su l'esecuzione di un compito di precompilazione:

configurazione Jboss Jasper

Spero che questo aiuti.

Alcuni contenitori JSP (indicati al punto 8.4.2 della specifica JSP 1.2) sostenere la capacità di precompilare una pagina JSP.

Per precompilare una pagina JSP, accedere alla pagina con una stringa di query di? Jsp_precompile

http://hostname.com/mywebapp/mypage.jsp?jsp_precompile

La pagina JSP non verrà eseguita. Se il contenitore supporta precompilazione, la pagina JSP sarà compilato se necessario.

Si veda anche http://www.rgagnon.com/javadetails/java-0414 .html

Pablojim è sulla strada giusta. Hai solo bisogno di qualche informazione in più per avere una visione completa di quello che sta succedendo. Ecco come ho capito.

In prod, hai cambiato un jsp che richiede altri JSP essere ricompilate. In modo per loro di essere ricompilati una delle 2 cose deve accadere

  1. La versione compilata del jsp deve essere cancellato.
  2. Il jsp stesso ha bisogno di essere modificato (o anche se è "toccato" - data di modifica viene aggiornata)

Se hai ancora bisogno di verificare che tutte le JSP funzionano, saranno tutti bisogno di essere precompilati utilizzando un task ant . questo consente anche di distribuire il file WAR con le JSP precompilati nel file di guerra. Questo dovrebbe risolvere il problema.

Se i file non vengono distribuiti in un file di guerra, ma in un formato esploso, si dovrebbe considerare seriamente il confezionamento tua web app in un file WAR per la distribuzione. Questo lo rende un bel pacchetto da distribuire tra gli ambienti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top