JavaÖеÄClassNotFoundException¡ª¡ªÕÒ²»µ½ÀàÒªÔõô½â¾ö£¿ - Î÷ºçÊÐÍø - Powered by Discuz!

Î÷ºçÊÐÍø

±êÌâ: JavaÖеÄClassNotFoundException¡ª¡ªÕÒ²»µ½ÀàÒªÔõô½â¾ö£¿ [´òÓ¡±¾Ò³]

×÷Õß: xubin    ʱ¼ä: 2025-12-3 15:10
±êÌâ: JavaÖеÄClassNotFoundException¡ª¡ªÕÒ²»µ½ÀàÒªÔõô½â¾ö£¿

ÔÚJava¿ª·¢¹ý³ÌÖУ¬³ÌÐòÔËÐÐʱÅ׳ö`ClassNotFoundException`ÊÇ¿ª·¢Õß³£Óöµ½µÄÒì³£Ö®Ò»¡£¸ÃÒì³£±íÃ÷JVMÔÚÀà·¾¶£¨Classpath£©ÖÐÕÒ²»µ½Ö¸¶¨µÄÀ࣬ͨ³£·¢ÉúÔÚ¶¯Ì¬¼ÓÔØÀࣨÈçͨ¹ý`Class.forName()`»ò·´Éä»úÖÆ£©»ò¼ÓÔØÒÀÀµ¿âʱ¡£±¾ÎĽ«´ÓÒì³£³ÉÒò¡¢Õï¶Ï·½·¨¡¢½â¾ö·½°¸¼°Ô¤·À²ßÂÔËĸöά¶ÈÕ¹¿ª·ÖÎö£¬°ïÖú¿ª·¢ÕßϵͳÐÔ½â¾ö´ËÀàÎÊÌâ¡£JavaÖеÄClassNotFoundException¡ª¡ªÕÒ²»µ½ÀàÒªÔõô½â¾ö£¿https://www.sundawu.cn/post-4890.htmlÏà¹ØÎÊÌ⣬»¶Ó­µã»÷½øÈëÍøÕ¾Á´½Ó£¡


Ò»¡¢ClassNotFoundExceptionµÄ³ÉÒò·ÖÎö
1.1 Àà·¾¶ÅäÖôíÎó

JVMÒÀÀµ`CLASSPATH`»·¾³±äÁ¿»ò`-cp`²ÎÊý¶¨Î»ÀàÎļþ¡£Èô·¾¶ÅäÖÃÒÅ©¹Ø¼üĿ¼»òJARÎļþ£¬»áµ¼ÖÂÀàÎÞ·¨¼ÓÔØ¡£ÀýÈ磺

// ´íÎóʾÀý£ºÎ´Ö¸¶¨ÒÀÀµJAR·¾¶
java -cp . com.example.MainClass
// Õýȷд·¨Ó¦°üº¬ËùÓÐÒÀÀµ
java -cp ".;lib/*.jar" com.example.MainClass
1.2 ÒÀÀµÈ±Ê§»ò°æ±¾³åÍ»

ÏîÄ¿ÒÀÀµµÄµÚÈý·½¿âδÕýÈ·ÒýÈ룬»ò´æÔÚ¶à¸ö°æ±¾³åÍ»¡£³£¼û³¡¾°°üÀ¨£º

Maven/GradleÒÀÀµÎ´ÏÂÔØÍêÕû£¨¼ì²é±¾µØ²Ö¿â`.m2`»ò`.gradle`Ŀ¼£©
IDEδ×Ô¶¯Ìí¼ÓÒÀÀµµ½¹¹½¨Â·¾¶£¨ÈçEclipseµÄ`Build Path`ÅäÖã©
ÔËÐÐʱʹÓÃÁËÓë±àÒëʱ²»Í¬µÄ¿â°æ±¾
1.3 ¶¯Ì¬¼ÓÔØ»úÖÆÎÊÌâ

ͨ¹ý·´É䶯̬¼ÓÔØÀàʱ£¬ÈôÀàÃûƴд´íÎó»òÀ಻´æÔÚÓÚÀà·¾¶ÖУ¬»á´¥·¢´ËÒì³£¡£ÀýÈ磺

try {
    Class.forName("com.nonexistent.Class"); // ÀàÃû´íÎó»ò²»´æÔÚ
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
1.4 Ä£¿é»¯ÏµÍ³£¨JPMS£©ÏÞÖÆ

Java 9ÒýÈëµÄÄ£¿éϵͳ¿ÉÄÜÏÞÖÆÀàµÄ¿É¼ûÐÔ¡£ÈôÀàλÓÚδµ¼³öµÄ°üÖУ¬¼´Ê¹´æÔÚÓÚÀà·¾¶Ò²ÎÞ·¨¼ÓÔØ£º

// module-info.java ʾÀý
module com.example {
    exports com.example.api; // ½öµ¼³öÖ¸¶¨°ü
}
¶þ¡¢Õï¶ÏClassNotFoundExceptionµÄ²½Öè
2.1 È·ÈÏÒì³£´¥·¢Î»ÖÃ

ͨ¹ý¶ÑÕ»¸ú×Ù¶¨Î»ÎÊÌâ´úÂë¡£ÀýÈ磺

java.lang.ClassNotFoundException: com.example.Utils
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.example.Main.main(Main.java:10)
´Ë´¦ÏÔʾ`Main.java`µÚ10Ðг¢ÊÔ¼ÓÔØ`com.example.Utils`Ààʧ°Ü¡£

2.2 ÑéÖ¤ÀàÊÇ·ñ´æÔÚ

ʹÓÃÒÔÏ·½·¨¼ì²éÀàÎļþÊÇ·ñÔÚÔ¤ÆÚλÖãº

½âѹJARÎļþ²é¿´ÄÚÈÝ£º`jar tf your-library.jar | grep ClassName`
¼ì²é±àÒëÊä³öĿ¼£¨Èç`target/classes`»ò`bin/`£©
ʹÓÃ`javap`¹¤¾ßÑéÖ¤Àࣺ`javap -cp your.jar com.example.ClassName`
2.3 ¼ì²éÀà·¾¶ÅäÖÃ

ͨ¹ý´úÂë´òÓ¡µ±Ç°Àà·¾¶£º

public class ClasspathPrinter {
    public static void main(String[] args) {
        ClassLoader loader = ClasspathPrinter.class.getClassLoader();
        System.out.println("Classloader: " + loader.getClass().getName());
        System.out.println("Classpath: " + System.getProperty("java.class.path"));
    }
}
Èý¡¢½â¾ö·½°¸Óë×î¼Ñʵ¼ù
3.1 »ù´¡ÐÞ¸´·½·¨

3.1.1 ÐÞÕýÀà·¾¶ÅäÖÃ

ÃüÁîÐÐÔËÐÐʱÏÔʽָ¶¨Àà·¾¶£º`java -cp "lib/*:." com.example.Main`
IDEÖмì²éÏîÄ¿¹¹½¨ÅäÖã¨ÈçIntelliJµÄ`Project Structure > Modules > Dependencies`£©
WebÓ¦ÓÃÖÐÈ·±£`WEB-INF/lib`Ŀ¼°üº¬ËùÓÐÒÀÀµJAR
3.1.2 ÖØÐÂÏÂÔØÒÀÀµ¿â

¶ÔÓÚMavenÏîÄ¿£º

mvn dependency:purge-local-repository
mvn clean install
¶ÔÓÚGradleÏîÄ¿£º

gradle --refresh-dependencies build
3.2 ¶¯Ì¬¼ÓÔØÓÅ»¯

3.2.1 ÍêÕûÀàÃûÑéÖ¤

È·±£¶¯Ì¬¼ÓÔØµÄÀàÃû°üº¬ÍêÕû°ü·¾¶£¬ÇÒ´óСдÃô¸Ð£º

// ´íÎóʾÀý
Class.forName("utils.Helper");
// ÕýȷʾÀý
Class.forName("com.example.utils.Helper");
3.2.2 ×Ô¶¨ÒåÀà¼ÓÔØÆ÷

ÔÚ¸´ÔÓ³¡¾°Ï£¬¿Éͨ¹ý¼Ì³Ð`ClassLoader`ʵÏÖ×Ô¶¨Òå¼ÓÔØÂß¼­£º

public class CustomClassLoader extends ClassLoader {
    private String libPath;
   
    public CustomClassLoader(String libPath) {
        this.libPath = libPath;
    }
   
    @Override
    protected Class> findClass(String name) throws ClassNotFoundException {
        byte[] classData = loadClassData(name);
        if (classData == null) {
            throw new ClassNotFoundException(name);
        }
        return defineClass(name, classData, 0, classData.length);
    }
   
    private byte[] loadClassData(String className) {
        // ʵÏÖ´Ó×Ô¶¨Òå·¾¶¼ÓÔØÀà×Ö½ÚÂëµÄÂß¼­
        // ...
    }
}
3.3 Ä£¿é»¯ÏµÍ³ÊÊÅä

¶ÔÓÚJava 9+Ä£¿é»¯ÏîÄ¿£º

ÔÚ`module-info.java`ÖÐÕýÈ·µ¼³ö°ü£º`exports com.example.utils;`
ʹÓÃ`requires`ÉùÃ÷ÒÀÀµÄ£¿é£º`requires org.apache.commons;`
ÔËÐÐʱÌí¼ÓÄ£¿é·¾¶²ÎÊý£º`java --module-path libs --module com.example/com.example.Main`
ËÄ¡¢Ô¤·ÀÐÔ´ëÊ©
4.1 ¹¹½¨¹¤¾ßÓÅ»¯

4.1.1 MavenÒÀÀµ¹ÜÀí

ʹÓÃ``È·±£°æ±¾Ò»Ö£¬²¢Í¨¹ý`mvn dependency:tree`·ÖÎöÒÀÀµÊ÷£º


   
        
            org.apache.commons
            commons-lang3
            3.12.0
        
   
4.1.2 GradleÒÀÀµËø¶¨

ÆôÓÃÒÀÀµËø¶¨·ÀÖ¹ÒâÍâÉý¼¶£º

// build.gradle
enableFeaturePreview('TYPESAFE_PROJECT_ACCESSORS')
dependencyLocking {
    lockAllConfigurations()
}
4.2 ³ÖÐø¼¯³É¼ì²é

ÔÚCI/CDÁ÷³ÌÖÐÌí¼ÓÀà·¾¶ÑéÖ¤²½Ö裺

ʹÓýű¾¼ì²éJARÎļþÍêÕûÐÔ
ͨ¹ýµ¥Ôª²âÊÔ¸²¸Ç¶¯Ì¬¼ÓÔØ³¡¾°
¼¯³É¾²Ì¬·ÖÎö¹¤¾ß£¨ÈçSonarQube£©¼ì²âDZÔÚÎÊÌâ
4.3 ÈÕÖ¾Óë¼à¿Ø

ʵÏÖÈ«¾ÖÒì³£´¦ÀíÆ÷¼Ç¼Àà¼ÓÔØÊ§°Üʼþ£º

public class ClassLoadingExceptionHandler {
    public static void logAndHandle(ClassNotFoundException e) {
        Logger.error("Àà¼ÓÔØÊ§°Ü: " + e.getMessage(), e);
        // ¿ÉÑ¡£º·¢Ë͸澯»òÖ´Ðнµ¼¶²ßÂÔ
    }
}
Îå¡¢µäÐͰ¸Àý·ÖÎö
5.1 °¸ÀýÒ»£ºWebÓ¦ÓÃÖеÄÀàȱʧ

ÎÊÌâÏÖÏ󣺲¿ÊðTomcatºó·ÃÎÊÒ³Ãæ±¨`ClassNotFoundException: com.example.servlet.MyServlet`

¸ù±¾Ô­Òò£º

佫ÏîÄ¿±àÒëÊä³öĿ¼ÅäÖÃΪ`WEB-INF/classes`
ÒÀÀµµÄµÚÈý·½JARδ·ÅÈë`WEB-INF/lib`
½â¾ö·½°¸£º

// MavenÅäÖÃʾÀý

    src/main/webapp/WEB-INF/classes
   
        
            src/main/resources
            WEB-INF/classes
        
   
5.2 °¸Àý¶þ£º¶¯Ì¬´úÀíÀà¼ÓÔØÊ§°Ü

ÎÊÌâÏÖÏó£ºÊ¹ÓÃ`java.lang.reflect.Proxy`´´½¨´úÀí¶ÔÏóʱÅ׳öÒì³£

¸ù±¾Ô­Òò£º½Ó¿ÚʵÏÖÀàλÓڷDZê×¼Àà·¾¶£¨Èç²å¼þĿ¼£©

½â¾ö·½°¸£º

// ×Ô¶¨ÒåÀà¼ÓÔØÆ÷¼ÓÔØ²å¼þÀà
File pluginDir = new File("plugins");
URL[] urls = new URL[pluginDir.listFiles().length];
for (int i = 0; i  implClass = pluginLoader.loadClass("com.plugin.ServiceImpl");
Service service = (Service) Proxy.newProxyInstance(
    pluginLoader,
    new Class[]{Service.class},
    new InvocationHandler() {...}
);
Áù¡¢½ø½×µ÷ÊÔ¼¼ÇÉ
6.1 ʹÓÃ`-verbose:class`²ÎÊý

Æô¶¯JVMʱÌí¼Ó¸Ã²ÎÊý¿ÉÊä³öÀà¼ÓÔØÏêÇ飺

java -verbose:class com.example.Main
# Êä³öʾÀý£º
[Loaded com.example.Main from file:/C:/project/target/classes/]
[Loaded java.lang.Object from shared objects file]
6.2 Ô¶³Ìµ÷ÊÔÀà¼ÓÔØ

¶ÔÓÚ·Ö²¼Ê½ÏµÍ³£¬¿Éͨ¹ýJDWPÔ¶³Ìµ÷ÊÔ·ÖÎöÀà¼ÓÔØ¹ý³Ì£º

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \
     -cp "your-classpath" com.example.Main
6.3 Àà¼ÓÔØÆ÷²ã´Î·ÖÎö

±àд¹¤¾ßÀà´òÓ¡Àà¼ÓÔØÆ÷Ê÷×´½á¹¹£º

public class ClassLoaderTree {
    public static void printTree(ClassLoader loader, int level) {
        for (int i = 0; i
¹Ø¼ü´Ê£ºClassNotFoundException¡¢Àà·¾¶¡¢¶¯Ì¬¼ÓÔØ¡¢Ä£¿éϵͳ¡¢ÒÀÀµ¹ÜÀí¡¢Àà¼ÓÔØÆ÷¡¢JavaÒì³£´¦Àí¡¢¹¹½¨¹¤¾ß¡¢Õï¶Ï·½·¨¡¢Ô¤·À²ßÂÔ

¼ò½é£º±¾ÎÄϵͳ½âÎöJavaÖÐClassNotFoundExceptionµÄ³ÉÒòÓë½â¾ö·½°¸£¬º­¸ÇÀà·¾¶ÅäÖá¢ÒÀÀµ¹ÜÀí¡¢¶¯Ì¬¼ÓÔØ»úÖÆ¡¢Ä£¿é»¯ÏµÍ³ÊÊÅäµÈºËÐij¡¾°£¬Ìṩ´ÓÕï¶Ïµ½Ô¤·ÀµÄÈ«Á÷³ÌÖ¸µ¼£¬°ïÖú¿ª·¢Õ߸ßЧ½â¾öÀàÕÒ²»µ½ÎÊÌâ¡£




»¶Ó­¹âÁÙ Î÷ºçÊÐÍø (http://bbs.xihong021.cn/) Powered by Discuz! X3