ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有人解释了原因here,但我不确定我应该怎么做才能解决这个问题。仅供参考:我正在使用 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
如果您可以发布代码并提供有关您的环境的更多详细信息,这将有所帮助。
好吧,大部分代码只是 HTML。由于它在这一点上倒下,我没有太大进展。我正在使用 Tomcat 6,但我正在通过 Eclipse 调试选项运行。让我知道是否还有其他我可以提供的。
Scriptlet 是一种不好的做法:stackoverflow.com/questions/1831238/jsp-for-business-layer/… 使用 servlet。

P
Pascal Thivent

好吧,您并没有真正提供有关您的 web 应用程序的足够详细信息,但我的猜测是您有一个类似这样的 JSP:

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

并且在类路径中找不到 x.y.Z(即不存在于 WEB-INF/classes 下,也不存在于 WEB-INF/lib 的 JAR 中)。

仔细检查您在 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

或者捆绑 x.y.Z.class 的 JAR 存在于 WEB-INF/lib 下。


谢谢。这一切看起来都像你说的那样,这就是为什么它如此混乱。
感谢,但 package 是非法的包标识符;)
当然“只能导入一个类型。XYZ 解析为一个包”真正的意思是“在类路径中找不到依赖项”。当然!
A
Ankur

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

所以

<%@ 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;" %>

AFAIK 添加分号会产生错误,并且与删除行具有相同的效果。
这为我解决了一个问题。但是,在我删除分号后,它再次起作用。
分号会导致语法错误,但会在 eclipse 中触发重新检查,在删除分号后,导入恢复正常,没有红线下的摆动.. 奇怪但有效!
佚名

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


在手动将类文件复制到我的 Tomcat webapps/myApp/WEB-INF/classes 目录后,我看到了这个问题。 Tomcat的反弹修复了它。而且我猜重新部署也会起作用。
确实,这个信息很糟糕。即使他们不想费心区分这两种情况,它至少应该是“找不到类或解析为包”。
G
Gullbyrd

我在 Netbeans 中遇到了这个错误。与大多数像这样突然出现的奇怪错误一样,我通过转到项目属性,更改源/二进制格式(无关紧要,只是不同的东西)并进行清理和构建来解决它。


谢谢!哇,不敢相信这有效。下次遇到奇怪的 Netbeans 错误时,我会试试这个。我不知道为什么 Netbeans 会这样。现在我安装了一个新版本。
好的,我现在两次遇到这个问题,你的技巧两次都解决了。
我又吃了这个。这次我实际上是通过重命名/重构导致问题的包名称,进行干净+构建,然后重命名/重构回原来的样子,然后再进行一次干净+构建来解决它。这也起到了作用。
P
Pratik Gaurav

我通过在tomcat lib目录中添加jar来解决它。


A
Andreas Dolk

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

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

编辑

好的,编辑后,看起来是jsp的问题。

编辑 2

Here is another forum entry,问题似乎有相似之处,受害者通过重装eclipse解决了。我会先尝试一个 - 安装第二个 eclipse 实例,其中只有最必要的插件、一个新的工作区、导入到那个干净的工作区的项目,并希望最好......


y
yurin

也得到了这个例外。

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

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

不知道,或者它是 Eclipse 错误或者我错过了什么。


j
jediz

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


答对了。就我而言,问题类在另一个项目中,正如我所料,Netbeans 在更改时没有将其复制到 Tomcat 库中。
K
Kredns

我知道回复这篇文章有点太晚了,但由于我没有看到任何明确的答案,我还是会这样做......

您可能想在 Eclipse 中查看 META-INF 中的 MANIFEST.MF

那么您可能需要添加类文件的路径,例如..

Class-Path: WEB-INF/classes


当然不。这是默认设置。
K
Karan

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


C
Community

对我来说,这是一个错误的部署。正确部署,一切正常(查看 my question 了解详细信息)。


看起来错误的部署是这个问题的主要原因,重新部署对我有用。
A
Alessandro Marini

这通常发生在混合(在同一个 jsp 页面中)静态 jsp 导入时:

<%@include file="...

使用动态jsp导入:

<jsp:include page="...

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


佚名

您必须从包中导入某些内容,例如类、枚举或接口,如下所示:

import some.package.SomeClass;

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

import some.package.*;

编辑:也许我读得不够仔细。您尝试从文件系统中导入的包在哪里?它在 WEB-INF/lib 下吗?


W
William Billingsley

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

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

import foo.bar.*;
Baz myBaz;

您可以使用

foo.bar.Baz myBaz;

T
Tharaka

我有一个类似的问题。在 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>

C
Cocu_1012

我的贡献:我收到此错误是因为我创建了一个名为 3lp 的包。但是,根据 java 规范,您不能将包命名为以数字开头。我将其更改为_3lp,现在它可以工作了。


N
Nic Cottrell

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

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


H
H.Rabiee

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


O
Oliver Matthews

我通过将包含导入的类的 jar 文件添加到 WEB-INF/Lib 来解决它。


G
Graham P Heath

您是否尝试像我一样导入覆盖的类?

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

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


Z
Zybrion

所以我有同样的问题,只是想给出我的解决方案。也许有人面临同样的问题。

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

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

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

TLDR:Intellij 删除了我的 .war 工件中的 WEB-INF 文件夹。只需检查您的是否也丢失了。 (项目结构 -> 工件)


s
subha sri

tomcat 文件夹结构中有 Webapps/ROOT/ ,其中必须存在 WEB-INF 文件夹。如果将 WEB-INF 放在 Webapps/tomcat 中,则无法定位类文件和 jar。


G
Guilherme Taffarel Bergamin

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

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

在我目前的工作中工作的一年多时间里,我没有设置那个变量,也从来不需要它。但是这个特定的项目在 classpath 中需要这个变量,而 Eclipse 不会告诉我发生了 classpath 错误。


S
Srishti gupta

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


J
James Tweet

从 Eclipse 运行时,我遇到了同样的问题。为了解决这个问题,我进入了配置构建路径并从构建路径中删除了 src 文件夹。然后关闭并重新打开项目。然后我将 src 文件夹添加到构建路径中。 src 文件夹包含我试图访问的 java 类。


A
Andy

我有同样的错误信息,我的处理方法如下:

首先检查 Tomcat 发布 Web 应用程序的文件目录,例如 D:\Java\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\myDatatable\WEB-INF\classes,在我们通常把我们的课。如果这不是您放置课程的地方,那么您必须通过右键单击您的 Web 应用程序根名称来找出默认情况下它在哪里-->构建路径-->配置构建浴...->然后检查“源”选项卡并找出“默认输出文件夹”的字段值。这将是 Tomcat 放置您的课程的地方。您会看到尚未构建 XYZ 类。为了构建它,您可以转到菜单“项目”-->“清理...”-->选择要清理的 Web 应用程序。完成后,尝试重新启动您的 tomcat 服务器并再次检查文件目录。你的班级应该在那里。至少它对我有用。希望能帮助到你。


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

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅