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:\eclipseWorkspace\MentalArithmetic\WebContent,並在tomcat的conf目錄下的server.xml中配置host節,設置為

<Context path="" docBase="D:\eclipseWorkspace\MentalArithmetic\WebContent" debug="0" privileged="true" reloadable="true">
</Context>

2.項目中右鍵new一個java的class,類名叫MyClass,包名叫l1.l2,它會在java Resources節點下的src目錄下創建java文件,對應於MentalArithmetic目錄下的src目錄,類似這樣D:\eclipseWorkspace\MentalArithmetic\src\l1\l2,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,在MentalArithmetic\WebContent,也就是網站根目錄下。並在此文件中引入類,代碼如下:

<%@ 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也並非不可能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM