2009-06-04 19 views
7

Mi sono imbattuto in questo brutto comportamento su JBoss 4.2 in QA, e voglio soffermarmene sul nascere prima di andare in produzione e trovare qualche altro caso d'angolo.Come si può forzare la ricompilazione di jsps in JBoss 4.2?

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) 

una preesistente JSP chiamato questo metodo tramite:

methodName("param"); 

Sulla distribuzione del codice modificato, JBoss non ha ricompilato il JSP e questo ha causato un arresto anomalo in QA. L'aggiunta di un commento stupido al jsp ha risolto il problema (JBoss ha riconosciuto che il JSP lo ha modificato e ricompilato).

Esiste un'impostazione su JBoss per forzare la ricompilazione di JSP al riavvio?

MODIFICA: per chiarire alcuni punti nella risposta, l'impostazione è che i JSP fanno 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 ritiene che il jsp necessiti di una compilazione, pre-compili la ricompilazione della forza? Non sembra così. L'errore qui non è un errore di complicazione, è un errore di chiamata del metodo a causa della firma del metodo "modificato" (a livello di codice byte, non proprio a livello di codice).

Addendum: Si noti che recentemente abbiamo riscontrato in produzione che, anche con il flag di risposta accettato, le JSP non sono state ricompilate, anche se il JSP ha effettivamente cambiato. Grande bug lì, ma a prescindere, JBoss era normalmente chiuso. A questo punto sta diventando una vecchia versione di JBoss, ma se lo si sta ancora utilizzando, l'eliminazione del contenuto del lavoro e delle directory tmp è l'unico modo per essere sicuri.

Non sto cambiando la risposta accettata semplicemente perché arriva veramente al punto di quello che la domanda stava cercando. I bug di JBoss sono una specie di problema separato.

risposta

11

Se il 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. I JSP nel file di guerra non hanno timestamp più recenti dei loro file di classe JBoss compilati dall'ultima distribuzione? In caso contrario, non è possibile toccare i JSP come parte della costruzione di WAR/EAR prima della distribuzione. [Mi riferisco all'utilizzo del comando "touch" di Unix, non toccando manualmente ciascun file JSP.]

In alternativa, l'impostazione DeleteWorkDirOnContextDestroy in $ JBOSS/server/default/deploy/jboss-web.deployer/META-INF /jboss-service.xml potrebbe essere quello che stai cercando. Di default è falso, ma impostarlo su true può essere quello di cui hai bisogno. Penso che questo dovrebbe eliminare i file di classe di JSP su redeploy in modo che vengano ricreati al primo accesso di ogni JSP.

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

+1

Ottimo! Controllerò che funzioni, e se accetta la risposta. – Yishai

+5

+1 Grazie! Solo per notare in JBoss 5.1.0GA il file equivalente è $ JBOSS/server/default/deplyers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml –

+1

Grazie, questo ha risolto un problema che avevo con i cambiamenti jsp non è stato riflesso dopo una distribuzione. –

1

Non so di un'impostazione, ma l'eliminazione del file di classe Java generato nella directory di lavoro dell'istanza JBoss causerà la ricompilazione del JSP al prossimo richiamo.

+1

Grazie, ma sarebbe difficile da fare praticamente durante l'implementazione della produzione. – Yishai

1

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

Non sottile, ma farebbe il lavoro.

0

Un'opzione per te sarebbe quella di precompilare tutti i tuoi jsp al momento della compilazione. Ciò segnalerebbe rapidamente eventuali errori di compilazione.

Si potrebbe anche farlo in produzione, accelerando il primo accesso, ma ho la sensazione che lo desideri più per un passo di controllo qualità che altro. In tal caso, è possibile aggiungere il passaggio di precompilazione alla fase di test nel proprio strumento di creazione preferito, e quindi all'ambiente CI. Ciò fornirebbe la certezza che i jsp che non vengono compilati non lo renderanno fuori test.

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

Jboss Jasper configuration

Spero che questo aiuti.

+0

Grazie, lo facciamo in realtà. Il problema è che lo script di compilazione è conforme, e in una compilazione pulita, l'esempio va bene. Il problema qui è che il JSP sottostante deve essere ricompilato per funzionare anche se non è cambiato, e la ricompilazione funzionerebbe, ma il JSP non funzionerà senza ricompilazione. – Yishai

+0

Abbastanza sicuro che non troverà questo errore sulla build. Hai considerato la precompilatura sulla produzione? – Pablojim

+0

Come si precompila sulla produzione (quale impostazione si usa)?Ricompilerà tutto? – Yishai

0

Alcuni contenitori JSP (come specificato nella sezione 8.4.2 della specifica JSP 1.2) supportano la capacità di precompilare una pagina JSP.

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

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

non verrà eseguito La pagina JSP. Se il contenitore supporta la precompilazione, la pagina JSP verrà compilata se necessario.

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

0

Pablojim è sulla buona strada. Hai solo bisogno di più informazioni per avere una visione completa di ciò che sta succedendo. Ecco come lo capisco.

In prod, è stato modificato un jsp che richiede la ricompilazione di altri jsps. Per poterli ricompilare, è necessario che venga eseguita una delle 2 cose

  1. La versione compilata del jsp deve essere eliminata.
  2. Il jsp stesso deve 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 precompiled using an ant task. questo consente anche di distribuire il file war con i jsps precompilati nel file war. Questo dovrebbe risolvere il tuo problema.

Se i file non vengono distribuiti in un file di guerra, ma in formato esploso, è necessario seriously consider packaging your web app in un file di guerra per la distribuzione. Questo lo rende un bel pacchetto da distribuire tra gli ambienti.

+0

È schierato in una guerra, e io verifico con la precompilazione, ma i risultati della precompilazione sono semplicemente buttati, quindi JBoss sta prendendo le sue decisioni sulla ricompilazione, e in questo caso non è abbastanza aggressivo. – Yishai

Problemi correlati