Как я могу скомпилировать классы в пакетах, чтобы выполнить их позже с помощью "Java-программы" (без имени пакета)? - PullRequest
3 голосов
/ 06 февраля 2011

У меня есть быстрый вопрос относительно javac и пакетов в Java.

У меня есть простая программа (назовем ее Program.java), которая в данный момент находится в следующем каталоге:

  • myRepository / myProgram

В Program.java и других файлах .java в каталоге myRepository / myProgram я объявил package myProgram.* и также включил import myProgram.*;.

Поэтому, когда я набираю javac myProgram/Program.java, он прекрасно компилируется и работает нормально, если я набираю java myProgram/Program.

Однако я пытаюсь получить файлы .class для создания в каталоге myRepository,не myRepository/myProgram, где находятся исходные файлы.Я попытался javac myProgram/Program.java -d .., который создает файлы .class в каталоге myRepository, но когда я пробую "Программу java", она выдает мне следующую ошибку:

Исключение в потоке "main" java.lang.NoClassDefFoundError: Program (неправильное имя: myProgram / Program).

Есть ли какой-нибудь способ заставить файлы .class отображаться в главном каталоге (myRepository) вместо того, где находятся исходные коды (myRepository / myProgram) и сможете выполнять java Program, находясь внутри myRepository?

Ответы [ 3 ]

2 голосов
/ 06 февраля 2011

Вам лучше поместить исходные коды в каталог source / myProgram и создать каталог с именем build для размещения файлов .class.Таким образом, вы можете скомпилировать и запустить этот путь:

javac source/myProgram/Program.java -d build
cd build
java myProgram/Program
0 голосов
/ 06 февраля 2011

Вы должны вызывать компилятор из каталога myRepository, а не из каталога пакета, например: javac myProgram/Program.java, а затем java myProgram.Program.

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

Вы можете поместить их в другой каталог, но тогда они будут иметь правильную структуру там, и вы должны передать этот каталог своей ВМ:

javac -d ../classes myProgram/Program.java
java -cp ../classes myProgram.Program

Невозможно (с помощью команды java по умолчанию) выполнить класс в пакете, не упомянув имя пакета.

Вы можете использовать класс-оболочку, который находится в анонимном пакете (например, без объявления package), который просто вызывает исходный класс:

class Program {
   public static void main(String[] args) {
       // delegate to real main class and method:
       myProgram.Program.main(args);
   }
}

В качестве альтернативы, если вы разрабатываете с помощью IDE, вы часто можете просто запустить программу нажатием кнопки.

Для распространения вы должны вместо этого поместить все ваши файлы классов в файл jar и определить основной класс в манифесте. Тогда вы можете назвать свою программу так:

java -jar myProgram.jar
0 голосов
/ 06 февраля 2011

Упакованные классы нельзя хранить ни в одном каталоге.Эта ссылка может быть полезна: http://www.herongyang.com/Java-Tools/javac-Option-d-Specifying-Output-Directory.html

...