2013-01-15 27 views
0

我正面临类加载问题,我的皮包骨骼war打包在ear。 哪里还有其他ejb模块打包。有些可以通过弹簧加载,有些则不可以。ClassNotFoundException对于骨干战

想象以下场景:

someApp.ear 
|- someEJBs1.jar 
|- someEJBs2.jar 
... 
|- someEJBsX.jar 
|- someWar.war 

如果我从someWar.war尝试通过春季访问存在于一些类:

  • someEJBs1.jar它的工作原理
  • 但对于那些在someEJBs2.jar我得到java.lang.ClassNotFoundException

不知道问题出在哪里。 我的MANIFEST.MF根本不包含任何类路径信息。

我已经在想如果有什么方法可以在运行时(也许在调试期间)看到加载的类,或者可能为特定的war文件提供的类路径?

我运行在glassfish 3.1.1(这是一个要求,没有改变这一个是可能的)。

回答

1

试试下面的调试功能,在你的代码:

//Prints the Root directory 
    public static void printPWD() { 
     File dir1 = new File("."); 
     try { 
      System.out.println("Current dir : " + dir1.getCanonicalPath()); 
      dir1 = null; 
     } catch (Exception e2) { 
      e2.printStackTrace(); 
     } 
    } 


    // Prints all files on the ClassPath to the system.out 

    public static void printClasspathFiles() { 
     ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader(); 

     // Get the URLs 
     URL[] urls = ((URLClassLoader) sysClassLoader).getURLs(); 

     for (int i = 0; i < urls.length; i++) { 
      System.out.println(urls[i].getFile()); 
     } 
    } 

//prints the classpath to system.out 
print printClasspath(){ 
     System.out.println(System.getProperty("java.class.path")); 
} 

要获得所有加载的类,在getAllLoadedClasses方法将是有益的。 See Here

+0

感谢您的想法!我会检查的。 –

+1

我更新了我的答案。看一看。 –

+0

好吧,测试过它,但它没有提供任何有用的信息给我说实话。因为我无法看到所有可供类加载的罐子。但只有一些基本的玻璃鱼缸。无论如何,标记为正确的,因为它似乎是我可以从类加载器中获得的所有东西。此外,你回答我的问题,毫无疑问,在该:) –

0

好的,终于找到了根本原因,我忽略了在我的spring xml configs中包定义错误的问题。 :)

我应该正确读取错误信息。并仔细检查我认为是正确的。 (好吧,我的情况并不新鲜)

现在它适用于我。

+0

很高兴知道它的作品 –