2010-02-16 6 views
4

J'ai un problème lors de l'exécution d'un travail par lots sur mon serveur, alors qu'il fonctionne correctement depuis Eclipse sur mon poste de travail de développement.Pourquoi j'obtiens une exception NullPointerException lors de l'initialisation de Printemps

J'ai créé mon environnement Spring en utilisant Roo, j'ai créé une entité, et j'ai créé un lot qui fonctionne, et je l'ai bien testé sur ma boîte de développement. J'initialise mon contexte et fais le travail, mais quand je lance mon batch sur le serveur, le contexte n'est pas initialisé correctement. Voici le code:

public class TestBatch { 

    private static ApplicationContext context; 


    @SuppressWarnings("unchecked") 
    public static void main(final String[] args) { 

      context = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext.xml"); 
      try { 
       @SuppressWarnings("unused") 
       TestBatch app = new TestBatch(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
    } 

    public void TestBatch() { /** Do Something using the context **/ } 

} 

Et voici le journal et exception:

2010-02-16 11:54:16,072 [main] INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org[email protected]6037fb1e: startup date [Tue Feb 16 11:54:16 CET 2010]; root of context hierarchy 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194) 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:127) 
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:458) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:388) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at tld.mydomain.myproject.batch.TestBatch.main(TestBatch.java:51) 
Caused by: java.lang.NullPointerException 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.<clinit>(DefaultListableBeanFactory.java:103) 
    ... 7 more 

Toute idée ou des conseils quant à ce qui se passe? Mon classpath est défini sur $ PROJECTHOME/target/classes, et toutes mes dépendances sont dans $ PROJECTHOME/target/lib, et j'exécute en utilisant "export CLASSPATH = $ PROJECTHOME/cible/classes; java -Djava.endorsed.dirs = $ PROJECTHOME/target/lib tld.mydomain.myproject.batch.TestBatch "

Y at-il quelque chose dans ma configuration qui semble très mauvais? Quand je l'exécute à partir d'Eclipse, pas de problèmes, mais quand je le déploie sur le serveur où je veux l'exécuter et l'exécuter comme décrit ci-dessus, j'ai ce problème. Parce qu'il fonctionne à partir d'Eclipse, je crois que mes fichiers de configuration sont corrects, mais comment puis-je déboguer ce qui cause cela? Peut-être que j'ai des erreurs de configuration ou une incompatibilité entre le serveur et le poste de travail de développement après tout? Ou est-ce une manière vraiment bizarre de dire que le fichier n'est pas trouvé, et si oui, comment puis-je m'assurer qu'il trouve le bon fichier?

Je suis vraiment impatient d'entendre vos suggestions sur la façon de résoudre ce problème.

Vive

Nik

+0

Je suggère de regarder DefaultListableBeanFactory.java, ligne 103. Ou encore mieux, mettre un point d'arrêt là. –

+0

assurez-vous que 'applicationContext.xml' est en place sur le serveur. – Bozho

+0

L'applicationContext est dans $ CLASSPATH/META-INF/spring/applicationContext.xml En ce qui concerne la définition des points d'arrêt, comment puis-je le faire en cours d'exécution sur mon serveur? Il n'y a pas d'erreur quand je le lance dans mon EDI sur mon poste de travail – niklassaers

Répondre

7

La cause du problème est -Djava.endorsed.dirs=$PROJECTHOME/target/lib org.springframework.beans.factory.support.DefaultListableBeanFactory contient le code suivant:

static { 
    ClassLoader cl = DefaultListableBeanFactory.class.getClassLoader(); 
    try { 
     javaxInjectProviderClass = cl.loadClass("javax.inject.Provider"); //Line 103 
    } 
    catch (ClassNotFoundException ex) { 
     // JSR-330 API not available - Provider interface simply not supported then. 
    } 
} 

Il provoque une NullPointerException, parce que getClassLoader() retours null lorsque la classe est chargée par -Djava.endorsed.dirs. De javadoc:

Certaines implémentations peuvent utiliser null pour représenter le chargeur de classe bootstrap.

, utilisez -classpath (avec spécification explicite de tous les pots) au lieu de -Djava.endorsed.dirs

+0

Merci un groupe, qui l'a résolu pour moi. Mais alors je suis de retour à un chemin de classe gigantesque! Est-ce qu'il n'y a aucun moyen de garder mon classpathfreefree et toujours avoir mes programmes s'exécuter correctement? – niklassaers

+1

Il n'y a vraiment pas besoin de s'inquiéter de ce à quoi ressemble le chemin de classe. c'est juste un argument passé dans le programme. Il est rare que vous ayez besoin de le configurer manuellement, la plupart des applications permettent de le créer via un script ou une autre méthode. –

+1

Cela peut également poser problème dans Rational Application Developer/Eclipse, dans lequel vous avez ajouté des fichiers jars à une bibliothèque utilisateur marquée comme bibliothèque système. Quel soulagement, je pensais que le printemps ne libérerait certainement pas quelque chose comme le cadre de test de printemps qui ne fonctionnerait pas au sein de RAD ... Il s'avère que c'était mon problème. –

0

Il suffit d'ajouter les pots aux bibliothèques référencées et non à la bibliothèque de l'utilisateur. Cela a fonctionné pour moi!

2

Exception dans le thread "principal" java.lang.ExceptionInInitializerError est produit tout en ajoutant la bibliothèque utilisateur. J'ai fait face au même problème dans Hibernate et le printemps ainsi. Donc j'ai enlevé User Library dire "Spring" puis j'ajoute des bocaux manuellement cela fonctionne parfaitement.

1

Dans Eclipse:

Si vous utilisez la spring jars comme bibliothèque utilisateur (Say SpringLib), voir si la bibliothèque utilisateur pour le printemps est added(or checked) que System Library (ajouté au chemin de classe de démarrage). Si oui, remove la coche. »

Questions connexes