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

王明輝發表於2017-09-13

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

 

相關文章