srcAdd.jsp用于解决java.lang.NoSuchMethodError

本文介绍了一种使用JSP页面来定位Java类路径的方法,通过部署特定的JSP文件并传入类名参数,可以查找该类在系统中的具体位置,有助于解决jar包冲突等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发中,经常会遇到jar包冲突而抛出的:java.lang.NoSuchMethodError
,排查起来非常的麻烦。本JSP页面的功能就是用于java类路径定位,使用时将srcAdd.jsp放置在项目的根路径下,项目运行起来之后,在地址栏输入URL,如 .../srcAdd.jsp?className=java.net.URL即可查看类所在的路径


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%@ page import="java.security.*,java.net.*,java.io.*"%>  
<%!  
    public static URL getClassLocation(final Class cls)   
    {  
        if(cls==null)  
        {  
            throw new IllegalArgumentException("null input: cls");  
        }  
        URL result=null;  
        final String clsAsResource=cls.getName().replace('.', '/').concat(".class");  
        final ProtectionDomain pd=cls.getProtectionDomain();  
        // java.lang.Class contract does not specify if 'pd' can ever be null;  
        // it is not the case for Sun's implementations, but guard against null  
        // just in case:  
        if(pd != null)   
        {  
            final CodeSource cs=pd.getCodeSource();  
            // 'cs' can be null depending on the classloader behavior:  
            if(cs != null)   
            {  
                result=cs.getLocation();  
            }  
            if(result != null)   
            {  
                // Convert a code source location into a full class file location  
                // for some common cases:  
                if("file".equals(result.getProtocol()))   
                {  
                    try   
                    {  
                        if(result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip"))  
                        {  
                            result=new URL("jar:".concat(result.toExternalForm()).concat("!/").concat(clsAsResource));  
                        }  
                        else if(new File(result.getFile()).isDirectory())  
                        {  
                            result=new URL(result, clsAsResource);  
                        }  
                    }  
                    catch(MalformedURLException ignore)   
                    {  
                      
                    }  
                }  
            }  
        }  
        if(result == null)   
        {  
            // Try to find 'cls' definition as a resource; this is not  
            // document.d to be legal, but Sun's implementations seem to         //allow this:  
            final ClassLoader clsLoader=cls.getClassLoader();  
            result=clsLoader != null ? clsLoader.getResource(clsAsResource) : ClassLoader.getSystemResource(clsAsResource);  
        }  
        return result;  
    }  
%>  
<html>  
<head>  
<title>srcAdd.jar</title>  
</head>  
<body bgcolor="#ffffff">  
    使用方法,className参数为类的全名,不需要.class后缀,如  
    srcAdd.jsp?className=java.net.URL  
<%  
    try  
    {  
        String classLocation=null;  
        String error=null;  
        String className=request.getParameter("className");  
        classLocation=""+getClassLocation(Class.forName(className));  
        if(error == null)   
        {  
            out.print("类" + className + "实例的物理文件位于:");  
            out.print("<hr>");  
            out.print(classLocation);  
        }  
        else   
        {  
            out.print("类" + className + "没有对应的物理文件。<br>");  
            out.print("错误:" + error);  
        }  
    }  
    catch(Exception e)  
    {  
        out.print("异常。"+e.getMessage());  
    }  
%>  
</body>  
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值