Как скомпилировать java-пакеты с помощью javac

цель

Я пытаюсь скомпилировать (из командной строки) пакет java, который импортирует другой пакет.

предыдущая работа

Я следил за учебным пособием, расположенным по адресу: http://www.roseindia.net/java/master-java/createsubpackage.shtml

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

Структура файла примера

Вот структура файла:

+test_directory (contains CallPackage.java)
   -> importpackage
       -> subpackage (contains HelloWorld.java)

код

здесь CallPackage.java

/// CallPackage.java
import importpackage.subpackage.*;
class CallPackage{
  public static void main(String[] args){
  HelloWorld h2=new HelloWorld();
  h2.show();
  }
}

и вот HelloWorld.java

///HelloWorld.java

package importpackage.subpackage;

public class HelloWorld {
  public void show(){
  System.out.println("This is the function of the class HelloWorld!!");
  }
}

Попытка шагов

  • перейдите к подпакету и скомпилируйте HelloWorld.java

    $javac HelloWorld.java

  • перейти в test_directory и скомпилировать CallPackage.java

    $javac CallPackage.java

Ошибка компилятора

но я получаю сообщение об ошибке на последнем cmd:

CallPackage.java:1: package importpackage.subpackage does not exist
import importpackage.subpackage.*;
^
CallPackage.java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
  ^
CallPackage.java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
                    ^
3 errors

Большое спасибо за любую помощь!

-Питер

Ответ 1

Вы уверены, что importpackage/subpackage находится в вашем пути к классу?

-cp path или -classpath путь

Укажите, где найти файлы классов пользователя и (необязательно) процессоры аннотаций и исходные файлы. Этот путь класса переопределяет путь пользовательского класса в переменной среды CLASSPATH. Если ни CLASSPATH, -cp ни -classpath не указаны, путь к пользовательскому классу состоит из текущего каталога. Подробнее см. Установка пути к классу.

Если параметр -sourcepath не указан, путь к пользовательскому классу также выполняется для исходных файлов.

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

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

Ответ 2

Проблема заключалась в том, что путь класса должен быть установлен для каждой команды (javac и java):

Попытка шагов

  • вместо перехода на подпакет, скомпилируйте HelloWorld.java из top_level:

    $javac -cp . importpackage/subpackage/HelloWorld.java

  • скомпилировать CallPackage.java таким же образом:

    $javac -cp . CallPackage.java

  • запустите файл, используя путь класса:

    $java -cp . CallPackage

ПРИМЕЧАНИЕ: запуск "$ java CallPackage" приведет к ошибке "Ошибка: не удалось найти или загрузить основной класс CallPackage"

Таким образом, на каждом шаге должен указываться путь к классу. Он работал после запуска как таковой.

Ответ 3

(1) сначала скомпилируйте код

javac -d importpackage.subpackage.HelloWorld

(2), а затем скомпилируйте CallPackage.java

javac CallPackage.java

Ответ 4

Такая же ситуация для меня. И я пришел, чтобы взять на себя это, собрав классы в одно и то же время.
Например, вот мой проект:

+ beerV1
   -> classes
   -> src
         -> com
              -> example
                   -> model
                        -> BeerExpert.java
                   -> web
                        -> BeerSelect.java


BeerExpert.java:

package com.example.model;
import ...

public class BeerExpert{
    ...
}


BeerSelect.java:

package com.example.web;
import com.example.model.*;
import ...

public class BeerSelect {
      ...
}


Как вы можете видеть: BeerSelect.java пытается импортировать классы в пакет com.example.model.
В первый раз я скомпилировал BeerExert.java по команде:

--> javac -d classes src/com/example/model/BeerExpert.java

Затем:
--> javac -d classes src/com/example/web/BeerSelect.java

И в результате получилось:
-->... error: package com.example.model does not exist

Итак, я знал, что компиляция нескольких классов отдельно не будет работать в этом случае.


После страдания в google я нашел этот очень простой способ решить проблему:
Просто скомпилируйте все сразу:

--> javac -d classes src/com/example/model/BeerExpert.java src/com/example/web/BeerSelect.java 


Наконец, вот что я получил:

 + beerV1
           -> classes
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.class
                           -> web
                                -> BeerSelect.class
           -> src
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.java
                           -> web
                                -> BeerSelect.java

Надеюсь, что это поможет.