Java错误:只能导入类型。XYZ解析为包


77

我收到错误消息:“只能导入类型。XYZ解析为包。”

有人在这里解释了原因但是我不确定应该如何解决。仅供参考:我正在使用Eclipse。我在下面添加了执行导入的代码。java.util。*导入可以正常工作。

 <%@ 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();

 //
 %>

编辑:实际错误如下:

 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

如果您可以发布代码并提供有关环境的更多详细信息,将很有帮助。
Suresh Kumar,

好吧,大多数代码只是HTML。由于它已经落在这一点上,所以我没有取得太大进展。我正在使用Tomcat 6,但正在通过Eclipse debug选项运行。让我知道我还能提供什么。
ANKUR

2
小脚本是一种不好的做法:stackoverflow.com/questions/1831238/jsp-for-business-layer/…使用servlet。
BalusC,2009年

Answers:


64

好吧,您实际上并未在Web应用程序上提供足够的详细信息,但我猜您是拥有这样的JSP:

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

并且x.y.Z在类路径上找不到(即,在WEB-INF/classes或JAR中都不存在WEB-INF/lib)。

仔细检查您在Tomcat上部署的WAR具有以下结构:

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

或捆绑的JARx.y.Z.class位于下WEB-INF/lib


1
谢谢。一切看起来都像您所说的那样,这就是为什么它如此令人困惑。
ANKUR

1
荣誉,但是package非法的包裹识别码;)
BalusC,2009年

4
当然,“只能导入类型。XYZ解析为包”确实意味着“在类路径中找不到依赖项”。当然!
杰弗里·奈特

37

好,我解决了。在上一次导入中,我添加了“;” 通过复制其他代码示例。我想这是必需的标准行结尾。

所以

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

成为

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

1
AFAIK添加分号会产生错误,并且与删除行具有相同的效果。
Yster 2015年

1
这为我解决了一个问题。但是,在删除分号后,它又可以工作了。
丹尼尔·加蓬诺夫

分号会导致语法错误,但会在eclipse中触发重新检查,有些操作会在删除分号后如何将导入恢复到正常状态,而不会在红色线下摇晃。
AbelSurace

7

如果您拼写了错误的类名或该类不在类路径中,则JSP处理器将说它“解析为包”而不是不存在。今天,这让我发疯,因为我一直没看到自己写错字。


在将类文件手动复制到Tomcat webapps / myApp / WEB-INF / classes目录后,我看到了此问题。Tomcat的反弹修复了它。而且我猜想重新部署也可以。
user2529737

确实,这则消息令人恐惧。即使他们不想打扰区分这两种情况,也至少应该是“未找到类或将其解析为包”。
马库斯·朱尼乌斯·布鲁图斯

4

我在Netbeans中收到此错误。对于像这样的奇异错误,我会通过转到项目属性,更改源/二进制格式(无关紧要,只是有所不同)并进行清理和构建来解决。


谢谢!哇,简直不敢相信。下次我遇到奇怪的Netbeans错误时,将尝试此操作。我不知道为什么Netbeans这样的行为不当。现在,我安装了新版本,情况更多。
mikato

好的,我现在已经遇到过两次这个问题,您的技巧两次都解决了。
mikato

我只是又有一次。这次,我实际上是通过重命名/重构引起问题的程序包名称,进行清理+构建,然后将其重命名/重构为原来的样子并进行另一清理+构建来解决此问题的。那也成功了。
mikato

3

没有更多细节,这听起来像是类的导入声明中的错误。检查所有导入声明是从包中导入所有类还是单个类:

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

编辑

OK,编辑后,看起来像是一个jsp问题。

编辑2

这是另一个论坛条目,该问题似乎有相似之处,并且受害者通过重新安装Eclipse解决了该问题。我会先尝试一下-仅使用最必要的插件,新工作区,导入到该干净工作区的项目安装第二个eclipse实例,并希望最好...



2

也有这个例外。

环境:带有Eclipse的Mac使用Eclipse在Servers视图中从Eclipse内部运行Tomcat。

出于任何原因,Eclipse都不会将classes文件夹复制到WEB-INFclasses手动复制文件夹后,一切正常。

不知道,或者是Eclipse错误,或者我错过了一些东西。


1

在更改类名的字母大小写之后,我也遇到了这个奇怪的错误。该文件未按预期复制到tomcat服务器,我不得不手动将其删除并重新部署。也许是因为我使用不区分大小写的操作系统?


答对了。就我而言,问题类在另一个项目中,正如我所期望的那样,NetBeans在更改后没有将其复制到Tomcat库中。
daiscog 2013年

1

我知道现在回复这个帖子还为时已晚,但是由于我看不到任何明确的答案,所以我还是会这样做。

您可能想MANIFEST.MFMETA-INF日食中检查一下。

那么您可能需要添加类文件的路径。

Class-Path: WEB-INF/classes


当然不。这是默认值。
罗恩侯爵

1

单独生成.class文件,并将其粘贴到相关程序包中的工作区中。刷新项目。


1

对我来说,这是一个错误的部署。部署正确,一切正常(请查看我的问题以获取详细信息)。


看来错误的部署是此问题的主要原因,重新部署对我来说很有用。
Laurent-P

0

您必须从包中导入一些东西,例如类,枚举或接口,如下所示:

import some.package.SomeClass;

或者,从包中导入所有内容(不推荐)

import some.package.*;

编辑:也许我没有读足够近。您要从中导入的软件包在文件系统上的哪里?是在WEB-INF / lib下吗?


0

还有更多细节吗?(这是在JSP中还是在链接的网页中?)

如果是这样,您始终可以只使用完全限定的类名。
而不是:

import foo.bar.*;
Baz myBaz;

您可以使用

foo.bar.Baz myBaz;

0

我有一个类似的问题。在Eclipse中,我将我的项目与运行良好的示例项目(由Maven原型生成)进行了比较。我发现我的项目在/.classpath文件中错过了2行。我复制了这两行,并解决了该问题。似乎即使我在项目首选项中设置了构建路径,由于某些原因,eclipse也没有进行相应的更新。

<?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>

0

我的贡献:之所以出现此错误,是因为我创建了一个名为3lp的软件包。但是,根据Java规范,您不能以数字开头来命名软件包。我将其更改为_3lp,现在可以使用了。


0

我敢打赌,您有一个名为org.ivec.eresearch.knowledgeportal.model的程序包。类别(小c),并且在不区分大小写的文件系统(例如Windows或Mac)上运行。似乎当类和包存在时,编译器会感到困惑。

您可以重命名类“ Category”或包“ category”,此错误将消失。不幸的是,我不确定这是Tomcat还是ECJ错误。


0

如果您正在使用Maven并将Java类打包为JAR,请确保JAR是最新的。当然,仍然假定JAR在您的类路径中。



0

您是否要像以前一样导入一个覆盖的类?

如果是这样,则您覆盖的类位于错误的程序包中,或者根本不存在。

创建类或将类移动到正确的位置(src / [package.package]。[class])可以解决您的问题。


0

当混合(在同一jsp页面中)静态jsp导入时,通常会发生这种情况:

<%@include file="...

使用动态jsp导入:

<jsp:include page="...

并且您的类型已经由“静态导入” jsp导入。当“动态导入” jsp->需要使用(然后导入)相同类型时,将生成异常:“只能导入类型...”


0

所以我遇到了同样的问题,只想给出我的解决方案。也许有人遇到同样的问题。

我已经正确配置了我的工件,但是intellij不知何故混合了一些东西并删除了其中一个工件中的WEB-INF文件夹。

当我查看.war文件的内容时,每个类都位于正确的文件夹结构中。所以我不认为有什么丢失。但是,当我检查Intellij中的工件并将其与正常工作的工件进行比较时,我意识到,不存在带有类和库的WEB-INF文件夹。

将它们添加到工件中,它应该可以工作。

TLDR:Intellij删除了我的.war工件中的WEB-INF文件夹。只要检查您的失踪者也是如此。(项目Strucutre->工件)


0

tomcat文件夹结构具有Webapps / ROOT /,其中必须存在WEB-INF文件夹。如果将WEB-INF放在Webapps /中,tomcat不会找到类文件和jar。


0

只是添加了另一种实现此奇怪错误的方法

对我来说,发生的事情是classpath使用了tomcat的一些罐子TOMCAT_HOME变量。

我没有设置该变量,并且在过去的一年中从未使用过它。但是这个特定的项目期望在中使用该变量,classpath而Eclipse不会告诉我发生了classpath错误。


0

我遇到了同样的错误,我的java文件和软件包没有任何问题。后来我注意到文件夹名称WEB-INF的写法是这样的“ WEB_INF”。因此,仅更正文件夹名称即可解决问题


0

从Eclipse运行时,我遇到了同样的问题。为了解决该问题,我进入了“ Configure Build Path”并从构建路径中删除了src文件夹。然后关闭并重新打开该项目。然后,我将src文件夹添加到了构建路径。src文件夹包含我尝试访问的Java类。


-1

我有相同的错误消息,我的处理方式如下:

  1. 首先,检查Tomcat在其中发布Web应用程序的文件目录,例如D:\ Java \ workspace.metadata.plugins \ org.eclipse.wst.server.core \ tmp1 \ wtpwebapps \ myDatatable \ WEB-INF \ classes,我们通常把我们的课程。如果这不是放置课程的地方,则必须找出默认情况下的位置,方法是右键单击Web应用程序的根名称->构建路径->配置构建浴...->然后检查在“源”选项卡中,找到“默认输出文件夹”的字段值。这是Tomcat放置您的类的地方。
  2. 您会看到尚未构建XYZ类。为了构建它,您可以转到菜单“项目”->“清理...”->选择要清理的Web应用程序。
  3. 完成后,请尝试重新启动tomcat服务器,然后再次检查文件目录。您的班级应该在那里。至少对我有用。希望能帮助到你。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.