天天看點

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