repo上外部jar的classloader上的java.lang.NoClassDefFoundError
我试图加载外部jar,并从该jar创建所有类的结构 目前,jar正在repo上的不同位置上使用依赖项 访问的jar位于someurl/com/xyz/mystuff2.jar 所访问的jar mystuff1.jar依赖于someurl/com/abc/mystuff1.jar 我尝试了以下方法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 };
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