При компиляции кода Java не удается найти исходные файлы

#java #javac

#java #javac

Вопрос:

Я выполняю упражнение 1.2 подготовки к экзамену Oracle Java SE 8, в котором мне предлагается создать основной класс GreetingsUniverse и три класса, которые будут инициализированы основным классом; Mars , Earth и Venus .

У меня есть com каталог, хранящийся по адресу location: C:UsersChrisDocumentsJavaMM

 package com.ocajexam.tutorial;

import com.ocajexam.tutorial.planets.Earth;
import com.ocajexam.tutorial.planets.Venus;
import com.ocajexam.tutorial.planets.Mars;

public class GreetingsUniverse
{
    public static void main (String[] args)
    {
        System.out.println("Greetings, Universe!");
        Earth e = new Earth();
        Mars m = new Mars();
        Venus v = new Venus();
    }
}
 

 package com.ocajexam.tutorial.planets;

public class Mars
{
    public Mars()
    {
        System.out.println("Hello from Mars!");
    }
}
 

 package com.ocajexam.tutorial.planets;

public class Earth
{
    public Earth()
    {
        System.out.println("Hello from Earth!");
    }
}
 

 package com.ocajexam.tutorial.planets;

public class Venus
{
    public Venus()
    {
        System.out.println("Hello from Venus!");
    }
}
 

Цель упражнения — определить аргументы командной строки, необходимые для компиляции кода.

У меня есть файл GreetingsUniverse Java, хранящийся в comocajexamtutorial и хранилище planets в comocajexamtutorialplanets

Я пробовал различные решения, но безуспешно:

 javac -d . -cp comocajexamtutorialplanets comocajexamtutorialGreetingsUniverse.java

javac -d . -cp com comocajexamtutorialGreetingsUniverse.java
 

Я продолжаю получать следующую ошибку:

 C:UsersChrisDocumentsJavaMM>javac -d . -cp com comocajexamtutorialGreetingsUniverse.java
comocajexamtutorialGreetingsUniverse.java:8: error: cannot find symbol
                Earth e = new Earth();
                ^
  symbol:   class Earth
  location: class GreetingsUniverse
comocajexamtutorialGreetingsUniverse.java:8: error: cannot find symbol
                Earth e = new Earth();
                              ^
  symbol:   class Earth
  location: class GreetingsUniverse
comocajexamtutorialGreetingsUniverse.java:9: error: cannot find symbol
                Mars m = new Mars();
                ^
  symbol:   class Mars
  location: class GreetingsUniverse
comocajexamtutorialGreetingsUniverse.java:9: error: cannot find symbol
                Mars m = new Mars();
                             ^
  symbol:   class Mars
  location: class GreetingsUniverse
comocajexamtutorialGreetingsUniverse.java:10: error: cannot find symbol
                Venus v = new Venus();
                ^
  symbol:   class Venus
  location: class GreetingsUniverse
comocajexamtutorialGreetingsUniverse.java:10: error: cannot find symbol
                Venus v = new Venus();
                              ^
  symbol:   class Venus
  location: class GreetingsUniverse
6 errors
 

Кто-нибудь знает, где я ошибаюсь в этом?

Я также попробовал следующее, которое выдает другое сообщение об ошибке:

 C:UsersChrisDocumentsJavaMM>javac -d . comocajexamtutorialplanetsEarth.java;comocajexamtutorialplanetsMars.java;comocajexamtutorialplanetsVenus.java comocajexamtutorialGreetingsUniverse.java
 

Выдает эту ошибку:

 javac: file not found: comocajexamtutorialplanetsEarth.java;comocajexamtutorialplanetsMars.java;comocajexamtutorialplanetsVenus.java
Usage: javac <options> <source files>
use -help for a list of possible options
 

Файлы определенно есть, если я укажу каталог в planets каталоге, я смогу увидеть их там:

  Directory of C:UsersChrisDocumentsJavaMMcomocajexamtutorialplanets

16/10/2016  11:33    <DIR>          .
16/10/2016  11:33    <DIR>          ..
15/10/2016  21:48               135 Earth.java
15/10/2016  21:48               132 Mars.java
15/10/2016  21:48               135 Venus.java
 

Обновить:
После дальнейшей отладки это становится все более странным..

Я пытаюсь скомпилировать только файлы planet, используя первую половину команды:

 javac -d . -cp comocajexamtutorialplanets*.java
 

Когда я проверяю каталог planet, только две планеты скомпилированы. Когда я удаляю класс Java, который не компилируется, компилируется только 1 файл!

Когда я использую ту же команду, указывающую java-файл, который я хочу скомпилировать:

 javac -d . -cp comocajexamtutorialplanetsVenus.java
 

Я получаю следующую ошибку:

 javac: no source files
Usage: javac <options> <source files>
use -help for a list of possible options
 

Я не могу понять это, потому Venus.java что это был один из файлов, которые компилировались, когда я запускал команду /*.java компиляции для обнаружения любых файлов Java в каталоге

Комментарии:

1. Ваш путь к классу . , нет com .

2. Я также пробовал это и получаю ту же ошибку

3. Venus.java например, должен быть его собственный файл. Форматирование вашего вопроса не делает это очень понятным

4. Какую ОС вы используете? Я попробовал свою команду ниже как в Windows, так и в Ubuntu, чтобы убедиться, что она будет работать. Если возможно, не могли бы вы выполнить cd com ocajexam tutorial planets, а затем запустить ls или dir, чтобы получить содержимое каталога и опубликовать их здесь?

5. Я использую Windows 10 Home. Я dir проверил каталог, в котором находятся файлы planet: Directory of C:UsersChrisDocumentsJavaMMcomocajexamtutorialplanets и он показывает Earth.class , Earth.java , Mars.class , Mars.java , Venus.class и Venus.java

Ответ №1:

Сначала вам нужно скомпилировать все классы. Javac компилирует только ваш основной класс. Используйте javac -cp /path/to/file/*.java . Звездочка ( *.java ) означает компиляцию всех классов Java в папке.

Комментарии:

1. Это нормально компилирует эти файлы, но я все равно получаю ту же ошибку при попытке скомпилировать основной класс

2. Вам не нужно вручную компилировать каждый класс, если он находится в пути к классу. Компилятор достаточно умен, чтобы автоматически включать другие классы.

3. Тогда я не понимаю, почему он выдает ошибку, в которой говорится, что он не может их найти

Ответ №2:

В примере из учебного пособия OCA Java SE 8 Programmer I для программистов используется конструктор без круглых скобок.

 package com.ocajexam.tutorial.planets;

    public class Earth { 
        public Earth { 
            System.out.println("Hello from Earth!"); 
        } 
    }
 

это, конечно, должно быть

 package com.ocajexam.tutorial.planets;

    public class Earth { 
        public Earth () { 
            System.out.println("Hello from Earth!"); 
        } 
    }
 

Затем вы можете запустить javac com/ocajexam/tutorial/greetingsUniverse.java и java com/ocajexam/tutorial/GreetingsUniverse .

Хотя, строго говоря, это не ответ на вопрос (в котором используются конструкторы со скобками), это может помочь другим людям с той же ошибкой.

Ответ №3:

Все используемые файлы .java должны находиться в classpath. ie javac -d . -cp com comocajexamtutorial*.java comocajexamtutorialplanets*.java

Попробуйте выполнить: javac -d . -cp com com/ocajexam/tutorial/GreetingsUniverse.java com/ocajexam/tutorial/planets/Earth.java com/ocajexam/tutorial/planets/Mars.java com/ocajexam/tutorial/planets/Venus.java

Комментарии:

1. Я пробовал это и все еще получаю ту же ошибку

2. У вас вообще не может быть исходных файлов в пути к классам, а расположение файлов классов НЕ должно включать часть пути к пакету, потому что это добавляется автоматически.

3. За: docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html Если параметр -sourcepath не указан, поиск исходных файлов также выполняется в пути к пользовательскому классу.