ChatGPT解决这个技术问题 Extra ChatGPT

Java error: Only a type can be imported. XYZ resolves to a package

I get the error: "Only a type can be imported. XYZ resolves to a package."

Someone has explained the cause here but I am not sure what I supposed to do to fix this. FYI: I am using Eclipse. I have added the code that does the importing below. The java.util.* import works fine.

 <%@ page import="java.util.*"%>
 <%@ page import="org.eresearch.knowledgeportal.model.Category"%>
 <%@ page import="org.eresearch.knowledgeportal.dao.CategoryDao"%>

 <% 
  CategoryDao catDao = new CategoryDao();
  ArrayList<Category> catList = catDao.selectCategory();

 //
 %>

Edit: the actual error is below:

 org.apache.jasper.JasperException: Unable to compile class for JSP: 

 An error occurred at line: 7 in the generated java file
 Only a type can be imported. org.eresearch.knowledgeportal.model.Category resolves to a package
It will help if you can post the code and provide more details of your environment.
Well most of the code is just HTML. Since it falls over at this point I have not progressed much. I am using Tomcat 6 but I am running thing through Eclipse debug option. Let me know if theres anyhing else I can provide.
Scriptlets are a bad practice: stackoverflow.com/questions/1831238/jsp-for-business-layer/… Use a servlet.

P
Pascal Thivent

Well, you are not really providing enough details on your webapp but my guess is that you have a JSP with something like that:

<%@ page import="java.util.*,x.y.Z"%> 

And x.y.Z can't be found on the classpath (i.e. is not present under WEB-INF/classes nor in a JAR of WEB-INF/lib).

Double check that the WAR you deploy on Tomcat has the following structure:

my-webapp
|-- META-INF
|   `-- MANIFEST.MF
|-- WEB-INF
|   |-- classes
|   |   |-- x
|   |   |   `-- y
|   |   |       `-- Z.class
|   |   `-- another
|   |       `-- packagename
|   |           `-- AnotherClass.class
|   |-- lib
|   |   |-- ajar.jar
|   |   |-- bjar.jar
|   |   `-- zjar.jar
|   `-- web.xml
|-- a.jsp
|-- b.jsp
`-- index.jsp

Or that the JAR that bundles x.y.Z.class is present under WEB-INF/lib.


Thanks. It all looks as you say it ought to be, which is why it so confusing.
Kudos, but package is an illegal package identifier ;)
Of course "Only a type can be imported. XYZ resolves to a package" really means "dependency can't be found in classpath". Of course!
A
Ankur

OK I just solved it. In the last import I added a ";" by copying other code examples. I guess it's the standard line ending that is required.

So

<%@ page import="java.util.*" %>
<%@ page import="org.eresearch.knowledgeportal.dao.CategoryDao" %>
<%@ page import="org.eresearch.knowledgeportal.model.Category" %>

became

 <%@ page import="java.util.*" %>
 <%@ page import="org.eresearch.knowledgeportal.dao.CategoryDao" %>
 <%@ page import="org.eresearch.knowledgeportal.model.Category;" %>

AFAIK adding the semi-colon gives an error and has the same effect as removing the line.
This fixed an issue for me. However after I deleted the semicolon it worked again.
The semicolon causes a syntax error, but triggers a recheck in eclipse, some how after deleting the semicolon then the import is back to normal without the wiggly under line red.. weir weird but WORKS!
佚名

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.


I saw this problem after manually copying class files to my Tomcat webapps/myApp/WEB-INF/classes dir. A bounce of Tomcat fixed it. And I'd guess a redeploy would work as well.
Indeed, the message is terrible. Even if they don't want to bother to differentiate the two cases, it should at least have been "class not found or resolves to a package".
G
Gullbyrd

I got this error in Netbeans. As with most bizarre errors like this that appear out of nowhere, I resolve it by going to project properties, changing the Source/Binary Format (doesn't matter to what, just something different), and doing a clean and build.


Thank you! Wow, can't believe that worked. I will try this next time I have a weird Netbeans error. I don't know why Netbeans misbehaves like this. It happens more now that I installed a new version.
Ok, I've had this problem twice now and your trick fixed it both times.
I just had this again. I actually resolved it this time by renaming/refactoring the package name that was causing a problem, doing a clean + build, then renaming/refactoring back to what it was, and doing another clean + build. That did the trick as well.
P
Pratik Gaurav

I got it resolved by adding the jars in tomcat lib directory.


A
Andreas Dolk

Without further details, it sounds like an error in the import declaration of a class. Check, if all import declarations either import all classes from a package or a single class:

import all.classes.from.package.*;
import only.one.type.named.MyClass;

Edit

OK, after the edit, looks like it's a jsp problem.

Edit 2

Here is another forum entry, the problem seems to have similarities and the victim solved it by reinstalling eclipse. I'd try that one first - installing a second instance of eclipse with only the most necessary plugins, a new workspace, the project imported into that clean workspace, and hope for the best...


y
yurin

Got this exception as well.

Environment: Mac with Eclipse running Tomcat from inside Eclipse using Servers view.

For any reason Eclipse does not copy classes folder to WEB-INF. After classes folder was manually copied, everything works fine.

Don't know, or it is Eclipse bug or I missed something.


j
jediz

I experienced this weird error too, after changing letter case in the name of a class. The file was not copied to a tomcat server as expected, I had to delete it manually and redeploy. Maybe because I use case insensitive operating system?


Bingo. In my case, the problem class was in another project which was not copied by Netbeans to the Tomcat lib when changed, as I had expected.
K
Kredns

I know it's kinda too late to reply to this post but since I don't see any clear answer i'd do it anyway...

you might wanna check out the MANIFEST.MF in META-INF on your eclipse.

then you might need to add the path of your class files like..

Class-Path: WEB-INF/classes


Definitely not. That's the default.
K
Karan

generate .class file separate and paste it into relevant package into the workspace. Refresh Project.


C
Community

To me it was a wrong deployment. Deployed properly, everything works (check my question for details).


It looks like wrong deployment is the main reason of this issue, redeploying worked for me.
A
Alessandro Marini

This typically happens when mixing (in the same jsp page) static jsp import:

<%@include file="...

with dynamic jsp import:

<jsp:include page="...

and your type has been already imported by the "static imported" jsp. When the same type needs to be used (and then imported) by the "dynamically imported" jsp -> this generate the Exception: "Only a type can be imported..."


佚名

You have to import something FROM the package, like a class, enum, or interfacee, like this:

import some.package.SomeClass;

or, import everything from the package (not recommended)

import some.package.*;

edit: maybe I didn't read close enough. Where is the package you're trying to import from located on the filesystem? Is it under WEB-INF/lib?


W
William Billingsley

Are there more details? (Is this in a JSP as in the linked webpage?)

If so, you can always just use the fully qualified class name. rather than:

import foo.bar.*;
Baz myBaz;

you can use

foo.bar.Baz myBaz;

T
Tharaka

I had a similar issue. In eclipse I compared my project with a sample project which is working fine (generated by a maven archetype). I found my project has missed 2 lines in /.classpath file. I copied those 2 lines and it fixed the issue. It seems even though I set build path in project preferences, eclipse has not updated accordingly for some reasons.

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java"/>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
    ...
</classpath>

C
Cocu_1012

My contribution: I got this error because I created a package named 3lp. However, according to java spec, you are not allowed to name your package starts with a number. I changed it to _3lp, now it works.


N
Nic Cottrell

My bet is that you have a package called org.ivec.eresearch.knowledgeportal.model.category (small c) and are running on a non-case sensitive filesystem like Windows or Mac. It seems that the compiler gets confused when a class and package exist.

You can either renamed the class "Category" or the package "category" and this error will go away. Unfortunately I'm not sure if this is a Tomcat or ECJ bug.


H
H.Rabiee

If you are using Maven and packaging your Java classes as JAR, then make sure that JAR is up to date. Still assuming that JAR is in your classpath of course.


O
Oliver Matthews

I resolved it by adding the jar file containing the imported classes into WEB-INF/Lib.


G
Graham P Heath

Are you attempting to import an overridden class like I was?

If so, your overridden class is in the wrong package, or simply non-existent.

Creating, or moving the class into the correct location (src/[package.package].[class]) could solve your problem.


Z
Zybrion

So I had the same issue and just wanted to give my solution. Maybe someone faces the same problem.

I had properly configured my artifact but somehow intellij mixed something up and deleted the WEB-INF folder in one of my artifacts.

When I viewed the contents of my .war file every class was present in the correct folder structure. So I didn't think that anything was missing. But when I check the artifacts in Intellij and compared it to a working artifact then I realized, that the WEB-INF folder with the classes and libs were not present.

Add them to the artifact and it should work.

TLDR: Intellij deleted the WEB-INF Folder in my .war artifact. Just check if yours is missing aswell. (Project Strucutre -> Artifacts)


s
subha sri

The tomcat folder structure has Webapps/ROOT/ inside where the WEB-INF folder has to be present. If you place your WEB-INF inside Webapps/ tomcat is not locating the class files and jars.


G
Guilherme Taffarel Bergamin

Just adding yet another way of achieving this weird error

To me what happened is that the classpath had a few jars from tomcat by using the TOMCAT_HOME variable.

I didn't have that variable set and never needed it in over a year working in my current job. But this specific project was expecting this variable in the classpath and Eclipse wouldn't tell me there was a classpath error going on.


S
Srishti gupta

I was getting the same error and nothing was wrong with my java files and packages. Later I noticed that the folder name WEB-INF was written like this "WEB_INF". So correcting just the folder name solved the issue


J
James Tweet

I had this same issue when running from Eclipse. To fix the issue I went into the Configure Build Path and removed the src folder from the build path. Then closed and reopened the project. Then I added the src folder to the build path. The src folder contained the java class I was trying to access.


A
Andy

I had the same error message and my way to deal with it is as follows:

First go check the file directory where your Tomcat is publishing your web application, e.g. D:\Java\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\myDatatable\WEB-INF\classes, in which we normally put our classes. If this is not the place where you put your classes, then you have to find out where by default it is by right click your web application root name-->Build Path-->Configure Build Bath...-->Then check the "Source" Tab and find out the field value of "Default output folder". This shall be the place where Tomcat put your classes. You would see that XYZ class is not yet built. In order to build it, you could go to Menu "Project"-->"Clean..."-->Select your web application to clean. After it's completed, try restart your tomcat server and go check the file directory again. Your class should be there. At least it works for me. Hope it helps.


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now