2010-03-09 6 views
3

Nous avons une grande installation d'application Web, utilisant Apache/Tomcat/Jasper et jboss. Dans l'environnement de développement, les JSP sont compilées à la volée. Malheureusement, il y a un paquet en particulier que la compilation à la volée ne semble pas pouvoir importer. Pour certaines classes, l'utilisation de références entièrement qualifiées plutôt que d'importations fonctionne, mais pas pour toutes. Toutes les classes en question sont dans un seul pot (nonEjb.jar). La pré-compilation des JSP fonctionne bien, mais il est bien sûr très pénible d'avoir à le faire chaque fois que nous avons besoin de changer un des fichiers affectés. Ce problème existe depuis un certain temps et j'aimerais vraiment le résoudre car je vais travailler dans la zone affectée.Échec de l'importation dans la compilation JSP à la volée

Voici une petite page de test. Il échoue pour la première importation. Les deux classes importées sont très similaires, la seule différence significative est le placement de leur paquet. (Et oui, je l'ai vérifié que les déclarations de paquet sont correctes pour les deux classes.)

<%@ page contentType="text/html; charset=utf-8" %> 
<%@ page errorPage="/error.jsp" %> 

<%@ page import="com.elementk.lms.product.otr.OtrProviderType" %> 
<%@ page import="com.elementk.lms.product.course.CourseType" %> 

<html> 
<body> 
<hr> 
Displaying the page... 
<br> 
<%= OtrProviderType.B24x7_PROVIDER.getId() %> value 
<br> 
<%= CourseType.SELF_STUDY.getId() %> value 
</hr> 
</body> 
<html> 

Résultat:

09 Mar 2010 21:29:40,555 ERROR [K] [RequestTimingFilter.doFilter:65] Unable to compile class for JSP: 

An error occurred at line: 6 in the generated java file 
The import com.elementk.lms.product.otr cannot be resolved 

je reçois la même erreur si je retire l'importation et entièrement qualifier la référence (comme com.elementk.lms.product.org.OtrProviderType).

Qu'est-ce qui peut amener le compilateur JSP à localiser l'une des classes mais pas l'autre?

+0

Terminé. J'inclurais une trace de pile, mais ce n'est pas différent de toute autre erreur de compilation JSP. (Il n'y a rien dedans qui semble indiquer le problème.) – JST

Répondre

3

Nous avons finalement déterminé pourquoi cela se produisait. Apparemment, le compilateur à la volée ne différencie pas case, et le paquet com.elementk.lms.product contient une classe nommée Otr. Le compilateur n'a pas pu faire la différence entre le paquet "com.elementk.lms.product.otr" et la classe "com.elementk.lms.product.Otr". Cela explique pourquoi le message d'erreur mentionne uniquement "com.elementk.lms.product.otr" même si l'importation d'origine était "com.elementk.lms.product.otr.OtrProviderType".

Nous avons dû réparer en évitant essentiellement le problème: nous avons renommé le paquet.

+0

Merci beaucoup! Nous avons eu le même problème et n'avons pas pu comprendre pourquoi un seul de nos paquets a continué à donner cette erreur ennuyeuse 'L'importation ne peut pas être résolue'. Nous avons renommé la classe :) – boes

+0

Très intéressant. Je me demandais pourquoi je recevais cette erreur sur ma machine de développement Mac (système de fichiers insensible à la casse) et pas sur notre serveur de test! Je me demande si cela peut être corrigé avec un paramètre Tomcat ... –

0

Où se trouve le nonEjb.jar? L'erreur de compilation suggère qu'il n'est pas dans le classpath (je suppose que le package/classname est 100% correct et disponible dans ce fichier JAR).

Il doit être placé au moins Webapp/WEB-INF/lib pour que JSP le reconnaisse. Un autre emplacement est Tomcat/lib, mais cela nécessite un contrôle d'administrateur complet sur le serveur et le fichier JAR serait accessible par toutes les applications Web déployées sur le serveur d'applications.

+0

Les deux classes référencées sont dans le même jar (avec un grand nombre d'autres classes). Il s'agit d'une application Web de grande envergure qui existe depuis plusieurs années. Je peux donc garantir que ce n'est pas un problème si le pot n'est pas dans le classpath. Je me demande maintenant s'il y a quelque chose au sujet du nom de paquet, et essayera ensuite de renommer le paquet. – JST

Questions connexes