Java-Fehler: Es kann nur ein Typ importiert werden. XYZ wird in ein Paket aufgelöst

77

Ich erhalte die Fehlermeldung: "Es kann nur ein Typ importiert werden. XYZ wird in ein Paket aufgelöst."

Jemand hat hier die Ursache erklärt , aber ich bin mir nicht sicher, was ich tun soll, um dies zu beheben. Zu Ihrer Information: Ich benutze Eclipse. Ich habe den Code hinzugefügt, der den Import unten ausführt. Der Import von java.util. * Funktioniert einwandfrei.

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

 //
 %>

Bearbeiten: Der eigentliche Fehler ist unten:

 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
Ankur
quelle
Es ist hilfreich, wenn Sie den Code veröffentlichen und weitere Details zu Ihrer Umgebung bereitstellen können.
Suresh Kumar
Nun, der größte Teil des Codes ist nur HTML. Da es zu diesem Zeitpunkt umfällt, bin ich nicht viel vorangekommen. Ich verwende Tomcat 6, aber ich führe die Eclipse-Debug-Option aus. Lassen Sie mich wissen, ob ich noch etwas anbieten kann.
Ankur
2
Scriptlets sind eine schlechte Praxis: stackoverflow.com/questions/1831238/jsp-for-business-layer/… Verwenden Sie ein Servlet.
BalusC

Antworten:

64

Nun, Sie geben nicht wirklich genug Details in Ihrer Webanwendung an, aber ich vermute, dass Sie eine JSP mit so etwas haben:

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

Und x.y.Zkann nicht auf dem Klassenpfad gefunden werden (dh ist weder unter WEB-INF/classesnoch in einem JAR von vorhanden WEB-INF/lib).

Stellen Sie sicher, dass das auf Tomcat bereitgestellte WAR die folgende Struktur aufweist:

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

Oder dass die JAR, die gebündelt x.y.Z.classwird, unter vorhanden ist WEB-INF/lib.

Pascal Thivent
quelle
1
Vielen Dank. Es sieht alles so aus, wie du es sagst, weshalb es so verwirrend ist.
Ankur
1
Kudos, ist aber packageeine illegale
Paketkennung
4
Natürlich bedeutet "Nur ein Typ kann importiert werden. XYZ wird in ein Paket aufgelöst" bedeutet wirklich "Abhängigkeit kann nicht im Klassenpfad gefunden werden". Na sicher!
Jeffrey Knight
37

OK, ich habe es gerade gelöst. Beim letzten Import habe ich ein ";" durch Kopieren anderer Codebeispiele. Ich denke, es ist das Standardzeilenende, das erforderlich ist.

Damit

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

wurden

 <%@ page import="java.util.*" %>
 <%@ page import="org.eresearch.knowledgeportal.dao.CategoryDao" %>
 <%@ page import="org.eresearch.knowledgeportal.model.Category;" %>
Ankur
quelle
1
Das Hinzufügen des Semikolons durch AFAIK führt zu einem Fehler und hat den gleichen Effekt wie das Entfernen der Linie.
Yster
1
Dies hat ein Problem für mich behoben. Nachdem ich das Semikolon gelöscht hatte, funktionierte es wieder.
Danil Gaponov
Das Semikolon verursacht einen Syntaxfehler, löst jedoch eine erneute Überprüfung in Eclipse aus. Nach dem Löschen des Semikolons ist der Import wieder normal, ohne dass die wackelige Unterlinie rot ist. Wehr seltsam, aber FUNKTIONIERT!
AbelSurace
7

Wenn Sie den Klassennamen falsch buchstabieren oder sich die Klasse nicht im Klassenpfad befindet, sagt der JSP-Prozessor, dass sie "in ein Paket aufgelöst" wird, anstatt dass sie nicht vorhanden ist. Das machte mich heute verrückt, da ich immer wieder keinen Tippfehler sah, den ich gemacht hatte.


quelle
Ich habe dieses Problem festgestellt, nachdem ich Klassendateien manuell in mein Verzeichnis Tomcat webapps / myApp / WEB-INF / classes kopiert habe. Ein Sprung von Tomcat hat das Problem behoben. Und ich würde vermuten, dass ein erneuter Einsatz auch funktionieren würde.
user2529737
In der Tat ist die Nachricht schrecklich. Selbst wenn sie sich nicht die Mühe machen wollen, die beiden Fälle zu unterscheiden, sollte es zumindest "Klasse nicht gefunden oder in ein Paket aufgelöst" gewesen sein.
Marcus Junius Brutus
4

Ich habe diesen Fehler in Netbeans erhalten. Wie bei den meisten bizarren Fehlern wie diesem, die aus dem Nichts auftreten, löse ich sie, indem ich zu den Projekteigenschaften gehe, das Quell- / Binärformat ändere (egal was, nur etwas anderes) und eine Bereinigung und Erstellung durchführe.

Gullbyrd
quelle
Vielen Dank! Wow, ich kann nicht glauben, dass das funktioniert hat. Ich werde es versuchen, wenn ich das nächste Mal einen seltsamen Netbeans-Fehler habe. Ich weiß nicht, warum sich Netbeans so schlecht benimmt. Es passiert jetzt mehr, da ich eine neue Version installiert habe.
Mikato
Ok, ich hatte dieses Problem jetzt zweimal und dein Trick hat es beide Male behoben.
Mikato
Ich hatte das gerade wieder. Dieses Mal habe ich es tatsächlich behoben, indem ich den Paketnamen, der ein Problem verursacht hat, umbenannt / umgestaltet, einen Clean + Build durchgeführt, dann wieder in den ursprünglichen Namen umbenannt / umgestaltet und einen weiteren Clean + Build durchgeführt habe. Das hat auch den Trick gemacht.
Mikato
3

Ohne weitere Details klingt es wie ein Fehler in der Importdeklaration einer Klasse. Überprüfen Sie, ob alle Importdeklarationen entweder alle Klassen aus einem Paket oder einer einzelnen Klasse importieren:

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

Bearbeiten

OK, nach der Bearbeitung sieht es so aus, als wäre es ein JSP-Problem.

Bearbeiten 2

Hier ist ein weiterer Foreneintrag , das Problem scheint Ähnlichkeiten zu haben und das Opfer hat es durch die Neuinstallation von Eclipse gelöst. Ich würde das zuerst versuchen - eine zweite Instanz von Eclipse mit nur den notwendigsten Plugins, einem neuen Arbeitsbereich, dem in diesen sauberen Arbeitsbereich importierten Projekt installieren und auf das Beste hoffen ...

Andreas Dolk
quelle
3

Ich habe es durch Hinzufügen der Gläser im Tomcat Lib-Verzeichnis gelöst.

Pratik Gaurav
quelle
2

Habe auch diese Ausnahme.

Umgebung: Mac mit Eclipse, auf dem Tomcat in Eclipse mithilfe der Serveransicht ausgeführt wird.

Aus irgendeinem Grund kopiert Eclipse keinen classesOrdner in WEB-INF. Nachdem der classesOrdner manuell kopiert wurde, funktioniert alles einwandfrei.

Weiß nicht, oder es ist ein Eclipse-Fehler oder ich habe etwas verpasst.

Yurin
quelle
1

Ich habe diesen seltsamen Fehler auch erlebt, nachdem ich die Groß- und Kleinschreibung im Namen einer Klasse geändert hatte. Die Datei wurde nicht wie erwartet auf einen Tomcat-Server kopiert. Ich musste sie manuell löschen und erneut bereitstellen. Vielleicht, weil ich ein Betriebssystem verwende, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird?

jediz
quelle
Bingo. In meinem Fall befand sich die Problemklasse in einem anderen Projekt, das von Netbeans beim Ändern nicht wie erwartet in die Tomcat-Bibliothek kopiert wurde.
Daiscog
1

Ich weiß, dass es etwas zu spät ist, um auf diesen Beitrag zu antworten, aber da ich keine klare Antwort sehe, würde ich es trotzdem tun ...

Vielleicht möchten Sie das MANIFEST.MFIn META-INFIhrer Sonnenfinsternis überprüfen .

Dann müssen Sie möglicherweise den Pfad Ihrer Klassendateien wie ... hinzufügen.

Class-Path: WEB-INF/classes

Optimismus
quelle
Definitiv nicht. Das ist die Standardeinstellung.
user207421
1

Generieren Sie eine separate Klassendatei und fügen Sie sie in das entsprechende Paket in den Arbeitsbereich ein. Projekt aktualisieren.

Karan
quelle
1

Für mich war es ein falscher Einsatz. Bei ordnungsgemäßer Bereitstellung funktioniert alles (siehe meine Frage für Details).

Parsecer
quelle
Es sieht so aus, als ob eine falsche Bereitstellung der Hauptgrund für dieses Problem ist. Die erneute Bereitstellung hat bei mir funktioniert.
Laurent-P
0

Sie müssen etwas aus dem Paket importieren, z. B. eine Klasse, eine Aufzählung oder eine Schnittstelle, wie folgt:

import some.package.SomeClass;

oder importieren Sie alles aus dem Paket (nicht empfohlen)

import some.package.*;

edit: vielleicht habe ich nicht nah genug gelesen. Wo befindet sich das Paket, von dem Sie importieren möchten, im Dateisystem? Ist es unter WEB-INF / lib?


quelle
0

Gibt es mehr Details? (Ist dies in einer JSP wie auf der verlinkten Webseite?)

In diesem Fall können Sie immer nur den vollständig qualifizierten Klassennamen verwenden.
eher, als:

import foo.bar.*;
Baz myBaz;

Sie können verwenden

foo.bar.Baz myBaz;
William Billingsley
quelle
0

Ich hatte ein ähnliches Problem. In Eclipse habe ich mein Projekt mit einem Beispielprojekt verglichen, das einwandfrei funktioniert (generiert von einem Maven-Archetyp). Ich habe festgestellt, dass in meinem Projekt 2 Zeilen in der Datei /.classpath fehlen. Ich habe diese 2 Zeilen kopiert und das Problem behoben. Obwohl ich den Erstellungspfad in den Projekteinstellungen festgelegt habe, wurde Eclipse aus bestimmten Gründen nicht entsprechend aktualisiert.

<?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>
Tharaka
quelle
0

Mein Beitrag: Ich habe diesen Fehler erhalten, weil ich ein Paket mit dem Namen 3lp erstellt habe. Laut Java-Spezifikation dürfen Sie Ihr Paket jedoch nicht mit einer Nummer beginnen. Ich habe es in _3lp geändert, jetzt funktioniert es.

Cocu_1012
quelle
0

Ich wette, Sie haben ein Paket namens org.ivec.eresearch.knowledgeportal.model. Kategorie (klein c) und laufen auf einem Dateisystem ohne Berücksichtigung der Groß- und Kleinschreibung wie Windows oder Mac. Es scheint, dass der Compiler verwirrt ist, wenn eine Klasse und ein Paket existieren.

Sie können entweder die Klasse "Kategorie" oder das Paket "Kategorie" umbenennen, und dieser Fehler wird behoben. Leider bin ich mir nicht sicher, ob dies ein Tomcat- oder ein EuGH-Fehler ist.

Nic Cottrell
quelle
0

Wenn Sie Maven verwenden und Ihre Java-Klassen als JAR verpacken, stellen Sie sicher, dass JAR auf dem neuesten Stand ist. Ich gehe natürlich immer noch davon aus, dass JAR in Ihrem Klassenpfad ist.

H. Rabiee
quelle
0

Ich habe es behoben, indem ich die JAR-Datei hinzugefügt habe, die die importierten Klassen enthält WEB-INF/Lib.

Abdellah Benrebea
quelle
0

Versuchen Sie, eine überschriebene Klasse wie ich zu importieren?

In diesem Fall befindet sich Ihre überschriebene Klasse im falschen Paket oder ist einfach nicht vorhanden.

Das Erstellen oder Verschieben der Klasse an den richtigen Speicherort (src / [package.package]. [Class]) könnte Ihr Problem lösen.

Graham P Heath
quelle
0

Dies geschieht normalerweise beim Mischen (auf derselben JSP-Seite) des statischen JSP-Imports:

<%@include file="...

mit dynamischem JSP-Import:

<jsp:include page="...

und Ihr Typ wurde bereits von der "statisch importierten" JSP importiert. Wenn derselbe Typ vom "dynamisch importierten" JSP verwendet (und dann importiert) werden muss -> wird die Ausnahme generiert: "Es kann nur ein Typ importiert werden ..."

Alessandro Marini
quelle
0

Also hatte ich das gleiche Problem und wollte nur meine Lösung geben. Vielleicht steht jemand vor dem gleichen Problem.

Ich hatte mein Artefakt richtig konfiguriert, aber irgendwie hat Intellij etwas durcheinander gebracht und den WEB-INF-Ordner in einem meiner Artefakte gelöscht.

Als ich den Inhalt meiner .war-Datei betrachtete, war jede Klasse in der richtigen Ordnerstruktur vorhanden. Also habe ich nicht gedacht, dass etwas fehlt. Als ich jedoch die Artefakte in Intellij überprüfte und mit einem funktionierenden Artefakt verglich, stellte ich fest, dass der Ordner WEB-INF mit den Klassen und Bibliotheken nicht vorhanden war.

Fügen Sie sie dem Artefakt hinzu und es sollte funktionieren.

TLDR: Intellij hat den WEB-INF-Ordner in meinem .war-Artefakt gelöscht. Überprüfen Sie einfach, ob auch Ihre fehlt. (Projektstruktur -> Artefakte)

Zybrion
quelle
0

Die Tomcat-Ordnerstruktur enthält Webapps / ROOT /, in dem der WEB-INF-Ordner vorhanden sein muss. Wenn Sie Ihre WEB-INF in Webapps / Tomcat platzieren, werden die Klassendateien und Jars nicht gefunden.

subha sri
quelle
0

Fügen Sie einfach einen weiteren Weg hinzu, um diesen seltsamen Fehler zu erreichen

Mir ist passiert, dass die classpathein paar Gläser von Tomcat mit der TOMCAT_HOMEVariablen hatten.

Ich hatte diese Variable nicht festgelegt und brauchte sie seit über einem Jahr in meinem aktuellen Job nie mehr. Aber dieses spezielle Projekt erwartete diese Variable in der classpathund Eclipse würde mir nicht sagen, dass ein classpathFehler aufgetreten ist.

Guilherme Taffarel Bergamin
quelle
0

Ich habe den gleichen Fehler erhalten und nichts war falsch mit meinen Java-Dateien und -Paketen. Später bemerkte ich, dass der Ordnername WEB-INF wie folgt geschrieben war: "WEB_INF". Das Korrigieren nur des Ordnernamens löste das Problem

Srishti Gupta
quelle
0

Ich hatte das gleiche Problem, als ich von Eclipse aus lief. Um das Problem zu beheben, ging ich in den Build-Pfad konfigurieren und entfernte den Ordner src aus dem Build-Pfad. Dann geschlossen und das Projekt wieder geöffnet. Dann habe ich den Ordner src zum Erstellungspfad hinzugefügt. Der src-Ordner enthielt die Java-Klasse, auf die ich zugreifen wollte.

James Tweet
quelle
-1

Ich hatte die gleiche Fehlermeldung und gehe wie folgt damit um:

  1. Überprüfen Sie zunächst das Dateiverzeichnis, in dem Ihr Tomcat Ihre Webanwendung veröffentlicht, z. B. D: \ Java \ workspace.metadata.plugins \ org.eclipse.wst.server.core \ tmp1 \ wtpwebapps \ myDatatable \ WEB-INF \ classes in was wir normalerweise unsere Klassen setzen. Wenn dies nicht der Ort ist, an dem Sie Ihre Klassen platzieren, müssen Sie herausfinden, wo es sich standardmäßig befindet, indem Sie mit der rechten Maustaste auf den Stammnamen Ihrer Webanwendung klicken -> Erstellungspfad -> Build-Bad konfigurieren ...--> Dann überprüfen Klicken Sie auf die Registerkarte "Quelle" und ermitteln Sie den Feldwert des "Standardausgabeordners". Dies ist der Ort, an dem Tomcat Ihre Klassen platziert.
  2. Sie würden sehen, dass die XYZ-Klasse noch nicht erstellt wurde. Um es zu erstellen, können Sie zu Menü "Projekt" -> "Bereinigen ..." -> Wählen Sie Ihre zu bereinigende Webanwendung aus.
  3. Starten Sie nach Abschluss des Vorgangs Ihren Tomcat-Server neu und überprüfen Sie das Dateiverzeichnis erneut. Deine Klasse sollte da sein. Zumindest funktioniert es bei mir. Ich hoffe es hilft.
Schumann Ja
quelle