瘦小战争的ClassNotFoundException

时间:2013-01-15 16:22:13

标签: java glassfish ejb war ear

我面临在war内打包的瘦ear中的类加载问题。 哪里还有其他ejb模块打包。有些可以通过弹簧加载而有些则不加载。

想象一下以下情景:

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

如果我尝试从someWar.war通过spring访问一些类:

  • someEJBs1.jar工作
  • 但对于那些在某些EJBs2.jar的人我得到了java.lang.ClassNotFoundException

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

我一直在想是否有任何方法可以在运行时(可能在调试期间)看到加载的类,或者可能是为特定war文件提供的类路径?

我在glassfish 3.1.1中运行(这是一项要求,不可能对此更改)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

我想应该正确阅读错误消息。并仔细检查我认为是正确的。 (在我的情况下,这不是什么新鲜事)

现在它对我有用。