Prohibited package name: java.lang ...

Prohibited package name: java.lang ... - Java - Programmation

Marsh Posté le 21-12-2004 à 17:36:16    

bonjour,
 
Suite à quelques problèmes de performance rencontrés sur des transformations xsl, j'ai mis en place du xsltc: au premier appel au transformer, les informations utiles à la transformation sont conservées (un translet static, un singleton qui l'utilise et retourne un transformer et le tour est joué).
 
Tout ceci fonctionne très bien sur mon environnement de dev (jdk 1.4.2_02 & tomcat 5.0.19) en faisant attention de poser dans le endorsed de tomcat le jar de xalan qui va bien :)
 
Sur sun one web server (iplanet 6), avec le même jdk, cela ne fonctionne pas aussi bien : les classes du jdk étant prioritaires sur celles des jars inclus au projet, j'ai un magnifique conflit sur une des methodes du jar de xalan.  
 
Je me suis donc inspiré du classloader de cocoon qui permet de résoudre ce genre de problèmes : Le ParanoidClassLoader et la ParanoidServlet
 

Code :
  1. The ParanoidClassLoader reverses the search order for
  2. classes.  It checks this classloader before it checks its parent.


 
 
J'ai adapté la ParanoidServlet à mon code  
 

Code :
  1. public class ParanoidCocoonServlet extends HttpServlet {
  2. /**
  3.  * The name of the actual servlet class.
  4.  */
  5. public static final String DEFAULT_SERVLET_CLASS = "xxx.yyy.TestServlet" ;
  6.    
  7.     protected static final String CONTEXT_PREFIX = "context:";
  8.    
  9.     protected static final String FILE_PREFIX = "file:";
  10.    
  11. protected Servlet servlet;
  12.    
  13.     protected ClassLoader classloader;
  14.    
  15. public void init(ServletConfig config) throws ServletException {
  16.  super.init(config);
  17.  // Create the classloader in which we will load the servlet
  18.         // this can either be specified by an external file configured
  19.         // as a parameter in web.xml or (the default) all jars and  
  20.         // classes from WEB-INF/lib and WEB-INF/classes are used.
  21.         final String externalClasspath = config.getInitParameter("paranoid-classpath" );
  22.         if ( externalClasspath == null ) {
  23.             this.classloader = this.getClassLoader(this.getContextDir());
  24.         } else {
  25.             this.classloader = this.getClassLoader(externalClasspath, this.getContextDir());
  26.         }
  27.        
  28.         String servletName = config.getInitParameter("servlet-class" );
  29.         if (servletName == null) {
  30.             servletName = DEFAULT_SERVLET_CLASS;
  31.         }
  32.        
  33.         // Create the servlet
  34.  try {
  35.   Class servletClass = this.classloader.loadClass(servletName);
  36.            
  37.   this.servlet = (Servlet)servletClass.newInstance();
  38.  } catch(Exception e) {
  39.   throw new ServletException("Cannot load servlet " + servletName, e);
  40.  }
  41. ...


 
et mon code crash lors de l'instanciation de la servlet  
 

Code :
  1. // Create the servlet
  2.  try {
  3.   Class servletClass = this.classloader.loadClass(servletName);
  4.            
  5.   this.servlet = (Servlet)servletClass.newInstance();
  6.  } catch(Exception e) {
  7.   throw new ServletException("Cannot load servlet " + servletName, e);
  8.  }


 
Je récupère une SecurityException : Prohibited package name: java.lang  
 
Le nom de la servlet est correct et son package n'est pas java.lang.TestServlet ...  
 
Je n'ai rien trouvé de concluant sur google ou autre à ce sujet et je sèche ...  
 
Auriez vous une idée ?  :)
 
fred

Reply

Marsh Posté le 21-12-2004 à 17:36:16   

Reply

Marsh Posté le 21-12-2004 à 17:45:36    

tu pourrais filer la stacktrace ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-12-2004 à 17:46:23    

et c'est quoi la classe de xalan qui pose problème ?
 


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-12-2004 à 17:53:48    

L'exception est levée sur le newInstance
 

Code :
  1. java.lang.SecurityException: Prohibited package name: java.lang   at java.lang.ClassLoader.defineClass(ClassLoader.java:524)   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)   at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)   at java.net.URLClassLoader.access$100(URLClassLoader.java:55)   at java.net.URLClassLoader$1.run(URLClassLoader.java:194)   at java.security.AccessController.doPrivileged(Native Method)   at java.net.URLClassLoader.findClass(URLClassLoader.java:187)   at sdm.session.ParanoidClassLoader.loadClass(ParanoidClassLoader.java:110)   at java.lang.ClassLoader.loadClass(ClassLoader.java:235)   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)   at java.lang.ClassLoader.defineClass0(Native Method)   at java.lang.ClassLoader.defineClass(ClassLoader.java:537)   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)   at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)   at java.net.URLClassLoader.access$100(URLClassLoader.java:55)   at java.net.URLClassLoader$1.run(URLClassLoader.java:194)   at java.security.AccessController.doPrivileged(Native Method)   at java.net.URLClassLoader.findClass(URLClassLoader.java:187)   at sdm.session.ParanoidClassLoader.loadClass(ParanoidClassLoader.java:110)   at java.lang.ClassLoader.loadClass(ClassLoader.java:235)   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)   at java.lang.ClassLoader.defineClass0(Native Method)   at java.lang.ClassLoader.defineClass(ClassLoader.java:537)   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)   at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)   at java.net.URLClassLoader.access$100(URLClassLoader.java:55)   at java.net.URLClassLoader$1.run(URLClassLoader.java:194)   at java.security.AccessController.doPrivileged(Native Method)   at java.net.URLClassLoader.findClass(URLClassLoader.java:187)   at sdm.session.ParanoidClassLoader.loadClass(ParanoidClassLoader.java:110)   at java.lang.ClassLoader.loadClass(ClassLoader.java:235)   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)   at java.lang.ClassLoader.defineClass0(Native Method)   at java.lang.ClassLoader.defineClass(ClassLoader.java:537)   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)   at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)   at java.net.URLClassLoader.access$100(URLClassLoader.java:55)   at java.net.URLClassLoader$1.run(URLClassLoader.java:194)   at java.security.AccessController.doPrivileged(Native Method)   at java.net.URLClassLoader.findClass(URLClassLoader.java:187)   at sdm.session.ParanoidClassLoader.loadClass(ParanoidClassLoader.java:110)   at java.lang.ClassLoader.loadClass(ClassLoader.java:235)   at sdm.session.ParanoidServlet.init(ParanoidServlet.java:60)   at org.apache.catalina.core.StandardWrapper.loadServlet


 
Pour être plus précis, il faut le package xsltc de xalan. Je te donne la méthode dessuite

Reply

Marsh Posté le 21-12-2004 à 17:59:12    

bon, iplanet a planté et ne se relance plus... je m'en occupe et je te donne la réponse dans quelques minutes

Reply

Marsh Posté le 21-12-2004 à 18:36:44    

bon, apres un reboot de la station et quelques autres soucis, voici ta reponse benou :  
CORE3283: stderr: ERROR: 'org.apache.xml.utils.XMLChar.isValidQName(Ljava/lang/String;)Z'

Reply

Marsh Posté le 21-12-2004 à 19:10:11    

ben ca c'est une classe apache, elle est pas dans le JDK ... comment il pourrait y avoir un conflit ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-12-2004 à 09:23:52    

Il me semble que dans le jdk 1.4.2_02 il y a une version de xalan. D'où le conflit. ;)

Reply

Marsh Posté le 22-12-2004 à 09:39:03    

houlà ... ok. tin c'est la merde ca ! :/
 
regarde ce côté là : http://xml.apache.org/xalan-j/faq.html#faq-N100CC
 
la technique du <java-home>\lib\endorsed devrait marcher je pense ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-12-2004 à 09:46:36    

Je ne peux malheureusement pas passer par le <java-home>\lib\endorsed. Notre client dispose de plusieures applications tournant sur le même serveur. Je ne pourrais pas leur faire installer un nouveau iplanet avec une autre installation du jdk.  
Quant au XbootClasspath/p, j'ai commencé par utiliser ça. Cela fonctionne tres bien avec tomcat, mais je n'ai pas reussi à le mettre en place pour iplanet... il ne semble pas prendre en compte cette option...  
 

Code :
  1. -Xbootclasspath/p: /export/home/applis/xxx/xxx1_liv/WEB/WEB-INF/lib/xalan.jar


 
tout ça etant mis dans l'onglet "mon_appli/java/JVM Options"  d'iplanet


Message édité par fredatisi le 22-12-2004 à 09:54:54
Reply

Marsh Posté le 22-12-2004 à 09:46:36   

Reply

Marsh Posté le 22-12-2004 à 09:52:05    

pénible la touche tab, hein ? [:joce]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-12-2004 à 09:55:15    

clair  :lol:


Message édité par fredatisi le 22-12-2004 à 09:55:49
Reply

Marsh Posté le 22-12-2004 à 10:07:14    

je connais du tout iplanet donc je peux pas trop t'aider là dessus, mais je pense que dans ton cas faut que tu creuses pour faire marcher le Xbootclasspath ...  
la redefinission du classloader est une bidouille qui risque de t'attirer pas mal de problèmes ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-12-2004 à 11:40:32    

oui et non, c'est en place sous cocoon et ca marche bien. Je vais quand même creuser le xboot et je te previens quand (si ;)) ca marche. En tout cas, merci de ton attention. Je retourne en reunion.  
Fred

Reply

Marsh Posté le 22-12-2004 à 15:05:27    

Bon, c'est résolu, il fallait utiliser l'option -Djava.endorsed.dirs, la faire pointer sur un repo contenant les jars. Ceci pouvant etre configuré pour une instance donnée d'un serveur, c'est parfait.
 
Fred

Reply

Marsh Posté le 22-12-2004 à 16:12:00    

Merci pour la solution ... j'ai dans l'idée que tu seras pas le seul à avoir le problème ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed