• Only a type can be imported. classname resolves to a package的解决


    Only a type can be imported. l1.l2.MyClass resolves to a package

    ==========这里是解决方案===============

    把生成的MyClass.class复制到网站根目录下的WEB-INF下的classes目录下,如果没有classes,就建一个,然后在classes目录下,按照包的层级逐层建立目录,例如l1.l2.MyClass,就建一个l1目录,在l1目录下建l2目录,把MyClass.class复制到l2目录下,即可。

    ==========以下是过程===============

    昨天和今天,一直在尝试在JSP中调用JavaBean,看似很简单的事情,却遇到这个问题,遍搜全网,包括英文,下面这句给了我一些提示:

    If you spell the class name wrong or the class isn't on the classpath, the JSP processor will say it "resolves to a package" rather than that it doesn't exist. This was driving me crazy today as I kept not seeing a typo I'd made.

    就是说,你写错类名了,它就找不到,也就是说,随便写个类名,java找不到,就会出这个提示,说你写的这个类被解析为包,它不说找不到这个类。

    整个问题过程如下:

    1.用Eclipse Java Neon在项目中建立jsp页面a.jsp,位于D:eclipseWorkspaceMentalArithmeticWebContent,并在tomcat的conf目录下的server.xml中配置host节,设置为

    <Context path="" docBase="D:eclipseWorkspaceMentalArithmeticWebContent" debug="0" privileged="true" reloadable="true">
    </Context>

    2.项目中右键new一个java的class,类名叫MyClass,包名叫l1.l2,它会在java Resources节点下的src目录下创建java文件,对应于MentalArithmetic目录下的src目录,类似这样D:eclipseWorkspaceMentalArithmeticsrcl1l2,l1和l2是包的名字,layer1和layer2的意思。

    package l1.l2;
    
    public class MyClass {
        
        public MyClass() {
            
        }
        public String address;
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }

    3.项目中右键new一个jsp文件,我叫它a.jsp,在MentalArithmeticWebContent,也就是网站根目录下。并在此文件中引入类,代码如下:

    <%@ page language="java" import="l1.l2.MyClass"%>
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <form>
    
            <%
                MyClass b = new MyClass();
                b.setAddress("kkkkkkkkkkkkkkkkk");
    
                out.print(b.getAddress());
            %>
        </form>
    </body>
    </html>

    理论上,如果这是一个在eclipse中关联紧密的项目,像visual studio一样,这个时候应该是可以运行了。背后的很多工作,应当由IDE来完成。

    然而,问题来了。无论我怎样运行,都会提示Only a type can be imported. l1.l2.MyClass resolves to a package,做了很多尝试,确认我没有写错。把eclipse在build中生成的MyClass.class到处粘贴,每一个可能的地方,均无效。网上说tomcat会在网站根目录下的WEB-INF下的classes中找类的信息,这个其实是对的,但是在不清楚全过程的情况下,这么一句是无法解决问题的,我把MyClass.class复制到了classes目录下,然并卵,仍然无效。不细说了。

    找了很多网站,找了很多书,依然然并卵。

    最后,绝望极了。

    然后就思考一个问题,如果JSP页面中,随便写个导入类的语句,如<%@ page import="a.b.c"%>,就会报下面这个错

    Only a type can be imported. a.b.c resolves to a package

    无论a.b.c是否真的存在,这说明系统没有找到a.b.c这个类,那么问题就变成了“如何让系统找到自定义的类?”

    如果tomcat会在网站根目录下寻找类的字节码,那么它是不是像eclipse中定义的一样,一层一层地去寻找呢?

    打开网站根目录下的WEB-INF,这个目录是eclipse生成的,里面毛也没有。

    新建了一个classes目录,在其下又新建了一个l1子目录,在l1下又新建了一个l2子目录,把MyClass.class复制过来,再运行http://localhost/a.jsp,成功。

    我一点都不兴奋。

    这是不是意味着,每次写完javaBean,都要手动把class复制到WEB-INFO目录去?可能有更好的方法,目前不知道。

    作为eclipse来讲,如此基础的工作都没有完成,这个IDE真的好用么?

    是不是开源的工具都是这样,易用性较差,学习曲线陡峭,如果你会用,那它还挺好使的,如果你是不会用的初学者,要花很多的时间和精力去学习。

    从这个角度来看,微软真的挺伟大的,致力于让开发者把精力集中在业务上,开发工具简单得一塌糊涂,包括java的开发者在内,都认为VS太好用了,节省大量时间。但是它的正版工具价格与破解成本比起来,实在让人无法产生购买欲。如果VS和.net能继续开源,继续发展,超过Java也并非不可能。

  • 相关阅读:
    java Metaspace频繁FGC问题定位(转载)
    JVM内存模型详解(转载)
    56. Merge Intervals
    begin again
    55. Jump Game
    54. Spiral Matrix
    53. Maximum Subarray
    52. N-Queens II
    51. N-Queens
    1. 赋值运算符函数
  • 原文地址:https://www.cnblogs.com/Sabre/p/7513645.html
Copyright © 2020-2023  润新知