Java 错误:只能导入一个类型。 XYZ 解析为一个包
Posted
技术标签:
【中文标题】Java 错误:只能导入一个类型。 XYZ 解析为一个包【英文标题】:Java error: Only a type can be imported. XYZ resolves to a package 【发布时间】:2010-12-23 22:16:09 【问题描述】:我收到错误:“只能导入一个类型。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 是一种不好的做法:***.com/questions/1831238/jsp-for-business-layer/… 使用 servlet。 【参考方案1】:从 Eclipse 运行时,我遇到了同样的问题。为了解决这个问题,我进入了配置构建路径并从构建路径中删除了 src 文件夹。然后关闭并重新打开项目。然后我将 src 文件夹添加到构建路径中。 src 文件夹包含我试图访问的 java 类。
【讨论】:
【参考方案2】:我遇到了同样的错误,我的 java 文件和包没有任何问题。后来我注意到文件夹名称WEB-INF是这样写的“WEB_INF”。因此,仅更正文件夹名称即可解决问题
【讨论】:
【参考方案3】:只是添加另一种方法来实现这个奇怪的错误
对我来说,发生的事情是 classpath
通过使用 TOMCAT_HOME
变量从 tomcat 中获得了一些罐子。
我没有设置该变量,并且在我目前的工作中工作了一年多以来从未需要它。但是这个特定的项目在 classpath
中期待这个变量,而 Eclipse 不会告诉我有一个 classpath
错误发生。
【讨论】:
【参考方案4】:tomcat 文件夹结构中有 Webapps/ROOT/ 里面必须有 WEB-INF 文件夹。如果您将 WEB-INF 放在 Webapps/tomcat 中,则无法定位类文件和 jar。
【讨论】:
【参考方案5】:也遇到了这个异常。
环境:带有 Eclipse 的 Mac 使用服务器视图从 Eclipse 内部运行 Tomcat。
出于任何原因,Eclipse 不会将 classes
文件夹复制到 WEB-INF
。手动复制classes
文件夹后,一切正常。
不知道,或者是 Eclipse 错误或者我错过了什么。
【讨论】:
【参考方案6】:所以我遇到了同样的问题,只是想给出我的解决方案。也许有人面临同样的问题。
我已经正确配置了我的工件,但不知何故 intellij 混淆了一些东西并删除了我的一个工件中的 WEB-INF 文件夹。
当我查看 .war 文件的内容时,每个类都存在于正确的文件夹结构中。所以我不认为缺少任何东西。但是当我检查 Intellij 中的工件并将其与工作工件进行比较时,我意识到带有类和库的 WEB-INF 文件夹不存在。
将它们添加到工件中,它应该可以工作。
TLDR:Intellij 删除了我的 .war 工件中的 WEB-INF 文件夹。只需检查您的是否也丢失了。 (项目结构 -> 工件)
【讨论】:
【参考方案7】:我通过在 tomcat lib 目录中添加 jar 来解决它。
【讨论】:
【参考方案8】:这通常发生在混合(在同一个 jsp 页面中)静态 jsp 导入时:
<%@include file="...
动态jsp导入:
<jsp:include page="...
并且你的类型已经被“静态导入”jsp 导入了。当“动态导入”jsp需要使用(然后导入)相同的类型时->这会生成异常:“只能导入一个类型...”
【讨论】:
【参考方案9】:我有同样的错误信息,我的处理方法如下:
-
首先检查 Tomcat 发布 Web 应用程序的文件目录,例如D:\Java\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\myDatatable\WEB-INF\classes,我们通常在其中放置我们的类。如果这不是您放置课程的地方,那么您必须通过右键单击您的 Web 应用程序根名称来找出默认情况下它的位置-->构建路径-->配置构建浴...->然后检查“源”选项卡并找出“默认输出文件夹”的字段值。这应该是 Tomcat 放置类的地方。
您会看到尚未构建 XYZ 类。为了构建它,您可以转到菜单“项目”-->“清理...”-->选择要清理的 Web 应用程序。
完成后,尝试重新启动您的tomcat服务器并再次检查文件目录。你的班级应该在那里。至少它对我有用。希望对您有所帮助。
【讨论】:
【参考方案10】:对我来说,这是一个错误的部署。正确部署,一切正常(查看my question了解详情)。
【讨论】:
看来错误的部署是这个问题的主要原因,重新部署对我有用。【参考方案11】:好的,我刚刚解决了。在最后一次导入中,我添加了一个“;”通过复制其他代码示例。我想这是必需的标准行尾。
所以
<%@ 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 中触发重新检查,在删除分号后,导入恢复正常,没有红线下的摆动。奇怪但有效!跨度> 【参考方案12】:单独生成 .class 文件并将其粘贴到相关包中到工作区中。 刷新项目。
【讨论】:
【参考方案13】:如果您拼写错误的类名或该类不在类路径中,JSP 处理器将说它“解析为一个包”而不是它不存在。今天这让我发疯了,因为我一直没有看到我犯的错字。
【讨论】:
我在手动将类文件复制到我的 Tomcat webapps/myApp/WEB-INF/classes 目录后看到了这个问题。 Tomcat的反弹修复了它。而且我猜重新部署也可以。 确实,消息很糟糕。即使他们不想费心区分这两种情况,至少应该是“找不到类或解析为包”。【参考方案14】:您是否像我一样尝试导入覆盖的类?
如果是这样,则您的覆盖类位于错误的包中,或者根本不存在。
创建类或将类移动到正确的位置 (src/[package.package].[class]) 可以解决您的问题。
【讨论】:
【参考方案15】:我通过将包含导入类的 jar 文件添加到 WEB-INF/Lib
来解决它。
【讨论】:
【参考方案16】:如果您使用 Maven 并将 Java 类打包为 JAR,请确保 JAR 是最新的。当然,仍然假设 JAR 在您的类路径中。
【讨论】:
【参考方案17】:我知道现在回复这篇文章有点太晚了,但由于我没有看到任何明确的答案,我还是会这样做......
您可能想在 Eclipse 中查看 META-INF
中的 MANIFEST.MF
。
那么您可能需要添加类文件的路径,例如..
Class-Path: WEB-INF/classes
【讨论】:
绝对不是。这是默认设置。【参考方案18】:我敢打赌,你有一个名为 org.ivec.eresearch.knowledgeportal.model.category(小 c
)的包,并且在 Windows 或 Mac 等不区分大小写的文件系统上运行.当类和包存在时,编译器似乎会感到困惑。
您可以重命名类“类别”或包“类别”,此错误将消失。不幸的是,我不确定这是 Tomcat 还是 ECJ 错误。
【讨论】:
【参考方案19】:我在 Netbeans 中遇到了这个错误。与大多数像这样突然出现的奇怪错误一样,我通过转到项目属性,更改源/二进制格式(无关紧要,只是不同的东西)并进行清理和构建来解决它。
【讨论】:
谢谢!哇,不敢相信这有效。下次遇到奇怪的 Netbeans 错误时,我会试试这个。我不知道为什么 Netbeans 会这样。现在我安装了一个新版本。 好的,我已经遇到过两次这个问题,你的技巧两次都解决了。 我又遇到了这个。这次我实际上是通过重命名/重构导致问题的包名称,进行干净+构建,然后重命名/重构回原来的样子,然后再进行一次干净+构建来解决它。这也起到了作用。【参考方案20】:我的贡献:我收到这个错误是因为我创建了一个名为 3lp 的包。 但是,根据 java 规范,您不能以数字开头命名您的包。 我把它改成了_3lp,现在可以了。
【讨论】:
【参考方案21】:我遇到了类似的问题。在 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>
【讨论】:
【参考方案22】:在更改班级名称的字母大小写后,我也遇到了这个奇怪的错误。该文件未按预期复制到tomcat服务器,我不得不手动删除它并重新部署。也许是因为我使用不区分大小写的操作系统?
【讨论】:
宾果游戏。就我而言,问题类在另一个项目中,正如我所料,Netbeans 在更改时没有将其复制到 Tomcat 库中。【参考方案23】:嗯,你并没有真正提供足够的关于你的 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 解析为一个包”真正的意思是“在类路径中找不到依赖项”。当然!【参考方案24】:
如果没有更多细节,这听起来像是类的导入声明中的错误。检查所有导入声明是从包中导入所有类还是从单个类中导入:
import all.classes.from.package.*;
import only.one.type.named.MyClass;
编辑
好的,编辑后,看起来是jsp问题。
编辑 2
Here is another forum entry,问题似乎有相似之处,受害者通过重装eclipse解决了。我会先尝试一个 - 安装第二个 eclipse 实例,其中只有最必要的插件、一个新工作区、导入该干净工作区的项目,并希望最好......
【讨论】:
【参考方案25】:还有更多细节吗? (这是在链接网页中的 JSP 中吗?)
如果是这样,您始终可以只使用完全限定的类名。 而不是:
import foo.bar.*;
Baz myBaz;
你可以使用
foo.bar.Baz myBaz;
【讨论】:
【参考方案26】:您必须从包中导入一些内容,例如类、枚举或接口,如下所示:
import some.package.SomeClass;
或者,从包中导入所有内容(不推荐)
import some.package.*;
编辑:也许我读得不够仔细。您尝试从文件系统中导入的包在哪里?是在WEB-INF/lib下吗?
【讨论】:
以上是关于Java 错误:只能导入一个类型。 XYZ 解析为一个包的主要内容,如果未能解决你的问题,请参考以下文章