Помилка Java: можна імпортувати лише тип. XYZ вирішує пакет


77

З’являється повідомлення про помилку: "Імпортувати можна лише тип. XYZ перетворюється на пакет".

Хтось пояснив причину тут, але я не впевнений, що я мав би зробити, щоб це виправити. FYI: Я використовую 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. Повідомте мене, якщо є щось інше, що я можу надати.
Анкур

2
Скриплети - погана практика: stackoverflow.com/questions/1831238/jsp-for-business-layer/… Використовуйте сервлет.
BalusC

Відповіді:


64

Ну, ви насправді не надаєте достатньо деталей про свій веб-додаток, але я здогадуюсь, що у вас є JSP з приблизно таким:

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

І x.y.Zне може бути знайдений на шляху до класу (тобто не присутній WEB-INF/classesні в JAR, ні в JAR WEB-INF/lib).

Перевірте, чи WAR, який ви розгортаєте на Tomcat, має таку структуру:

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

Або що JAR, який пов’язує x.y.Z.class, присутній під WEB-INF/lib.


1
Дякую. Все виглядає так, як ви говорите, так і повинно бути, ось чому це так бентежить.
Анкур,

1
Слава, але packageє незаконним ідентифікатором пакета;)
BalusC

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, додаючи крапку з комою, видає помилку і має такий самий ефект, як видалення рядка.
Істер

1
Це вирішило проблему для мене. Однак після того, як я видалив крапку з комою, вона знову спрацювала.
Даніл Гапонов

Крапка з комою спричиняє синтаксичну помилку, але викликає повторну перевірку в затемненні, дещо, як після видалення крапки з комою, тоді імпорт повертається до норми, не хитаючись під червоною лінією .. дивно, дивно, але РОБОТИ!
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;

Редагувати

Добре, після редагування, схоже, це проблема jsp.

Редагувати 2

Ось ще одна публікація на форумі , проблема, схоже, має схожість, і жертва вирішила її, перевстановивши затемнення. Я спробував би це спочатку - встановив другий екземпляр eclipse лише з найнеобхіднішими плагінами, нову робочу область, проект, імпортований у цю чисту робочу область, і сподіваюся на краще ...



2

Отримав і цей виняток.

Середовище: Mac з Eclipse під управлінням Tomcat зсередини Eclipse за допомогою подання серверів.

З будь-якої причини Eclipse не копіює classesпапку в WEB-INF. Після classesкопіювання папки вручну все працює нормально.

Не знаю, або це помилка Eclipse, або я щось пропустив.


1

Я також відчув цю дивну помилку, змінивши регістр літер у назві класу. Файл не скопійовано на сервер tomcat, як очікувалося, мені довелося видалити його вручну та перерозподілити. Може тому, що я використовую операційну систему, що не чує регістр?


Бінго. У моєму випадку клас проблеми був в іншому проекті, який Netbeans не скопіював до бібліотеки Tomcat при зміні, як я очікував.
daiscog

1

Я знаю, що занадто пізно відповідати на цю публікацію, але оскільки я не бачу жодної чіткої відповіді, я б все одно це зробив ...

Ви могли б хотіти перевірити MANIFEST.MFінMETA-INF на вашому затемненні.

тоді вам може знадобитися додати шлях до ваших файлів класів, як ..

Class-Path: WEB-INF/classes


Точно ні. Це за замовчуванням.
user207421

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). Я виявив, що мій проект пропустив 2 рядки у файлі /.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. Здається, компілятор плутається, коли існує клас і пакет.

Ви можете перейменувати клас "Категорія" або пакет "Категорія", і ця помилка зникне. На жаль, я не впевнений, що це помилка 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 видалив папку WEB-INF в моєму артефакті .war. Просто перевірте, чи не відсутній і ваш. (Структура проекту -> Артефакти)


0

Структура папки tomcat має Webapps / ROOT /, всередині якої повинна бути папка WEB-INF. Якщо ви розміщуєте свій WEB-INF всередині Webapps / tomcat, це не знаходить файли класів та банки.


0

Просто додавши ще один спосіб досягнення цієї дивної помилки

Для мене те, що сталося, classpathбуло кілька банок від tomcat за допомогоюTOMCAT_HOME змінної.

У мене не було цієї набірної змінної, і вона мені ніколи не потрібна була більше року, працюючи на моїй поточній роботі. Але цей конкретний проект очікував цієї змінної в classpathі Eclipse не хотів сказати мені, що трапилася classpathпомилка.


0

Я отримував ту ж помилку, і з моїми файлами та пакунками Java нічого не було. Пізніше я помітив, що ім'я папки WEB-INF було написано так "WEB_INF". Отже, виправлення лише назви папки вирішило проблему


0

У мене була така сама проблема під час запуску з Eclipse. Щоб виправити проблему, я зайшов у Налаштування шляху збірки та видалив папку src із шляху збірки. Потім проект закрили та знову відкрили. Потім я додав папку src до шляху збірки. Папка src містила клас Java, до якого я намагався отримати доступ.


-1

У мене було одне і те ж повідомлення про помилку, і я маю справу з ним наступним чином:

  1. Спочатку перевірте каталог файлів, де ваш Tomcat публікує вашу веб-програму, наприклад D: \ Java \ workspace.metadata.plugins \ org.eclipse.wst.server.core \ tmp1 \ wtpwebapps \ myDatatable \ WEB-INF \ класів, у які ми зазвичай проводимо на заняттях. Якщо це не місце, де ви кладете свої класи, то вам потрібно з’ясувати, де це за замовчуванням, клацнувши правою кнопкою миші ім’я кореня веб-програми -> Шлях побудови -> Налаштувати Build Bath ... -> Потім перевірте на вкладці "Джерело" та дізнайтеся значення поля "Вихідна папка за замовчуванням". Це місце, де Tomcat проводить ваші заняття.
  2. Ви бачили б, що клас XYZ ще не побудований. Для того, щоб створити його, ви можете зайти в меню "Проект" -> "Очистити ..." -> Виберіть веб-програму для очищення.
  3. Після його завершення спробуйте перезапустити сервер tomcat і перевірте каталог файлів ще раз. Там повинен бути ваш клас. Принаймні це працює для мене. Сподіваюся, це допоможе.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.