Ошибка javac: имена классов принимаются только в том случае, если обработка аннотации запрашивается явно

113

Я получаю эту ошибку при компиляции своей Java-программы:

error: Class names, 'EnumDevices', are only accepted if annotation 
processing is explicitly requested
1 error

Вот код Java (я запускаю его в Ubuntu).

import jcuda.CUDA;    
import jcuda.driver.CUdevprop;    
import jcuda.driver.types.CUdevice;

public class EnumDevices {

  public static void main(String args[]) {
     CUDA cuda = new CUDA(true);    
        int count = cuda.getDeviceCount();

        System.out.println("Total number of devices: " + count);

        for (int i = 0; i < count; i++) {

          CUdevice dev = cuda.getDevice(i);
          String name = cuda.getDeviceName(dev);
          System.out.println("Name: " + name);
          int version[] = cuda.getDeviceComputeCapability(dev);

          System.out.println("Version: " + 
              String.format("%d.%d", version[0], version[1]));
          CUdevprop prop = cuda.getDeviceProperties(dev);
          System.out.println("Clock rate: " + prop.clockRate + " MHz");
          System.out.println("Threads per block: " + prop.maxThreadsPerBlock);
        }
    }
}

Вот команда javac:

javac -cp /home/manish.yadav/Desktop/JCuda-All-0.3.2-bin-linux-x86_64 EnumDevices

Как мне скомпилировать эту программу?

user513164
источник

Ответы:

132

Вам как минимум нужно добавить .javaрасширение к имени файла в этой строке:

javac -cp /home/manish.yadav/Desktop/JCuda-All-0.3.2-bin-linux-x86_64 EnumDevices

Из официального FAQ :

Имена классов HelloWorldApp принимаются только в том случае, если обработка аннотации запрашивается явным образом.

Если вы получили эту ошибку, вы забыли включить суффикс .java при компиляции программы. Помните, что это команда javac HelloWorldApp.java, а не javac HelloWorldApp.

Кроме того, во втором примере javac (в который вы фактически включили .java) вам необходимо включить все необходимые файлы .jar, необходимые для компиляции.

aioobe
источник
1
это тоже, но я думаю, это не привело бы к этой конкретной ошибке. Должен был выдать «файл не найден» или что-то в этом роде.
jwent
Согласен. Тем более, что это легко сделать ошибкой (поскольку .classпри запуске с помощью java).
aioobe
«Имена классов HelloWorldApp принимаются только в том случае, если обработка аннотации запрашивается явным образом». Что за глупый способ сказать, что файл не найден. Или на что должно ссылаться сообщение об ошибке? Я могу найти только это исправление, но не могу понять, почему сообщение об ошибке написано так.
masterxilo
1
При включенной обработке аннотаций вы можете программно генерировать классы во время компиляции. Таким образом, с обработкой аннотаций вы можете что- то скомпилировать, даже если файл не существует (т.е. вы создаете недостающие части на лету). Конечно, сообщение об ошибке вводит в заблуждение. Я вернусь к вам, если разберусь дальше.
aioobe
19

Меня это тоже озадачило, потому что я включил расширение .Java ... потом я заметил заглавную букву J.

Это также вызовет ошибку "обработки аннотации":

javac myclass.Java 

Вместо этого должно быть:

javac myclass.java 
Том Варфилд
источник
6

Используя javac ClassName.java для компиляции программы, затем используйте java ClassName для выполнения скомпилированного кода. Вы не можете смешивать javac только с ClassName (без расширения java).

Юн Юань
источник
5

Ошибка «Имена классов принимаются, только если явно запрашивается обработка аннотации» может быть вызвана одной или несколькими из следующих причин:

  1. Не использовать расширение .java для вашего файла java при компиляции.
  2. Неправильное использование заглавных букв в расширении .java (например, .Java) при компиляции.
  3. Любая другая опечатка в расширении .java при компиляции.
  4. При компиляции и запуске одновременно, забываем использовать '&&' для объединения двух команд (например, javac Hangman.java java Hangman). Мне потребовалось около 30 минут, чтобы понять это, что я заметил, запустив компиляцию и запуск программы отдельно, что, конечно же, отлично работало.

Возможно, это не полный список причин этой ошибки, но это причины, о которых я знаю до сих пор.

joshgoldeneagle
источник
3
chandan@cmaster:~/More$ javac New.java
chandan@cmaster:~/More$ javac New
error: Class names, 'New', are only accepted if annotation processing is explicitly requested
1 error

Так что если вы по ошибке после компиляции снова воспользуетесь javacдля запуска программы.

чандан
источник
3

Я узнал, что вы также можете получить эту ошибку, сохранив исходный файл в папке с именем Java.

Дэвид Миллер
источник
2

я думаю, это тоже из-за неправильной компиляции ..

так что для linux (ubuntu) .....

javac file.java

файл java

Амол Джагдейл
источник
3
В ответах следует попытаться уточнить, почему проблема возникает в первую очередь, а затем указать решение (если оно доступно)
Coder
1

Как можно воспроизвести эту загадочную ошибку на терминале Ubuntu:

Поместите это в файл с именем Main.java:

public Main{
    public static void main(String[] args){
        System.out.println("ok");
    }
}

Затем скомпилируйте это так:

user@defiant /home/user $ javac Main
error: Class names, 'Main', are only accepted if 
annotation processing is explicitly requested
1 error

Это потому, что вы не указали .javaв конце Main.

Сделайте это так, и он работает:

user@defiant /home/user $ javac Main.java
user@defiant /home/user $

Теперь хлопните себя по лбу и ворчите, что сообщение об ошибке такое загадочное.

Эрик Лещинский
источник
2
ты тоже: D! в обоих примерах вы написали Main без .java!
фрираннер
1

Возможно, вы компилируете с именем файла, а не с именем метода .... Проверьте, я тоже сделал ту же ошибку, но исправил ее быстро ..... # happy Coding

Сай Саран
источник
0

сначала загрузите jdk с https://www.oracle.com/technetwork/java/javase/downloads/index.html . Затем в поиске напишите «Редактировать системные переменные среды». В открытом окне я нажимаю нижнюю часть «Переменные среды». Затем в «Системные переменные» введите описание изображения здесь. Нажимайте внизу новое В поле новые переменные пишите «Путь». C: \ Program Files \ Java \ jdk1.8.0_191 \ bin ", но в моей ОС работает только этот" C: \ Program Files \ Java \ jdk1.8.0_191 \ bin \ javac.exe " введите описание изображения здесь нажмите ОК 3 раза

Запустить Cmd. Нажимаю нижнее окошко + R. Потом пишу cmd. В cmd напишите «cd (ваш каталог с кодом)» выглядит как C: \ Users \ user \ IdeaProjects \ app \ src. Затем напишите «javac (имя вашего основного класса для вашей программы) .java» выглядит как blabla.java, а javac создает байтовый код, например (имя вашего основного класса) .class в вашем каталоге. последняя запись в cmd "java (имя вашего основного класса)" и моя программа начинает работать

Мистер тинтин
источник
0

Ошибка: имя класса принимается, только если обработка аннотации явно запрашивается

Чтобы избежать этой ошибки, вы должны использовать команду javac с расширением .java.

Javac DescendingOrder.java <- это отлично работает.

Авниш
источник
0

Если вы компилируете несколько файлов в одной строке, убедитесь, что вы используете javac только один раз, а не для каждого файла класса.

Неправильно: введите описание изображения здесь

Верный: введите описание изображения здесь

Киран
источник