repo上外部jar的classloader上的java.lang.NoClassDefFoundError

repo上外部jar的classloader上的java.lang.NoClassDefFoundError,java,reflection,classloader,urlclassloader,Java,Reflection,Classloader,Urlclassloader,我试图加载外部jar,并从该jar创建所有类的结构 目前,jar正在repo上的不同位置上使用依赖项 访问的jar位于someurl/com/xyz/mystuff2.jar 所访问的jar mystuff1.jar依赖于someurl/com/abc/mystuff1.jar 我尝试了以下方法 try { u = new URL("jar", "", this.url /* Some url*/+ "!/"); URL[] urls = { u };

我试图加载外部jar,并从该jar创建所有类的结构

目前,jar正在repo上的不同位置上使用依赖项

访问的jar位于someurl/com/xyz/mystuff2.jar 所访问的jar mystuff1.jar依赖于someurl/com/abc/mystuff1.jar

我尝试了以下方法

try {
    u = new URL("jar", "", this.url /* Some url*/+ "!/");

    URL[] urls = { u };             
    URLClassLoader cl = URLClassLoader.newInstance(urls);

    Enumeration<JarEntry> entries = this.jarFile.entries();

    while (entries.hasMoreElements()) {
        JarEntry entry = entries.nextElement();

        /* Soft checks to make sure it is not pulling an inner class
         */

        if (entry.isDirectory() || !entry.getName().endsWith(".class")
                && !entry.getName().contains("$")) {
            continue;
        }

        String className = entry.getName().substring(0,
                entry.getName().length() - 6);
        className = className.replace('/', '.');
        try {
            @SuppressWarnings("unused")
            Class<?> c = cl.loadClass(className); /*It errors while   
                loading a class that are extending classes from mystuff.jar*/

        } catch (ClassNotFoundException e) {
            logger.error("ERROR: Classes were not loaded properly "
                    + e.getMessage());

        } catch (NoClassDefFoundError e) {
                logger.error("ERROR: Classes definition was not found "
                        + e.getMessage());
        }
    }
} catch (MalformedURLException e) {             
    logger.error("ERROR : There is an issue while accessing the 
        URL"+ e.getMessage());      
}

你能发布stacktrace吗?@NikolayKasapov:不确定这个问题,这会是安全问题吗?或者我必须分别从依赖JAR加载类吗?我假设发生错误是因为!entry.getName.contains$。当使用ClassLoader时,得到NoClassDefFoundError的唯一原因是您的case className变量中的类的名称不等于类的二进制名称。如果没有加载它们,您必须加载它们!!!如果是这种情况,我们是否必须分别从依赖jar加载所有文件?还是有更简单的方法直接检索它?
java.lang.NoClassDefFoundError: com/myorg/xyz/core/BaseClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:789)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at com.myorg.xyz.gotto.go.repomanager.MavenRepoManager.loadClassesFromJar(MavenRepoManager.java:97)
    at com.myorg.xyz.gotto.go.RepoManagerTest.testRepoManager(RepoManagerTest.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: java.lang.ClassNotFoundException: com.myorg.xyz.core.BaseClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:789)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 38 more