2016-03-23 3 views
2

Я изучаю пакеты java. Я успешно создал пакетный пакет, содержащий один файл .class Hello.class. Теперь я хочу добавить еще один файл класса в один и тот же пакет. Я назвал новый класс Java, как Goodbye.java и скомпилировал его в той же директории «пакет» с помощью командыдобавление класса в пакет

javac -d ./bin Goodbye.java 

. bin содержит каталог pack. компилировать Test.java файл, содержащий основную функцию через

javac -cp ./bin test.java 

команды. Компиляция работает нормально. Но когда я ввожу

java test 

команда. Я получаю

Hello, world 
Exception in thread "main" java.lang.NoClassDefFoundError: pack/Goodbye 
at test.main(test.java:9) 
Caused by: java.lang.ClassNotFoundException: pack.Goodbye 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
... 1 more 

Может кто-нибудь объяснить, что я сделал не так в этом случае? Я работаю над ubuntu 14.04 и делаю все в терминале.

Оба Hello.java и Goodbye.java файлы находятся в каталоге

/home/username/apps/src 

. Соответствующие файлы классов находятся внутри

/home/username/apps/bin/pack 

каталог. pack был создан

javac -d ./bin 

команда. Содержание Hello.java файла

package pack; 
public class Hello 
{ 
    public static void HelloMessage() 
    { 
     System.out.println("hello, world"); 
    } 
} 

Он работает нормально. Для его соответствующий файл класса загружается Содержание Goodbye.java файла

package pack; 
public class Goodbye 
{ 
    public static void message() 
    { 
     System.out.println("bye"); 
    } 
} 

test.java файл, который импортирует пакет находится в/главная/имя пользователя/каталога приложений. Он имеет следующие строки кода

import pack.*; 
public class test 
{ 
    public static void main(String args[]) 
    { 
     Hello.HelloMessage(); 
     Goodbye.message(); 
    } 
} 

Любая помощь очень ценится.

+0

Но почему бы вам не использовать IDE? Это облегчит вашу работу. – Hackerdarshi

+0

У меня есть фон C++ и привык к терминалу. Мне не нравятся IDE для неизвестного резонанса –

+0

Я думаю, хорошо знать, как это работает в командной строке. Это дает более глубокое понимание в конце, даже при работе исключительно с IDE позже. – vanje

ответ

1

Мое понимание ваших файлов класса, как следующее дерево:

/home/username/apps/bin 
        | 
        +-- pack 
        |  | 
        |  +--- Hello.class 
        |  | 
        |  +--- Goodbye.class 
        | 
        +-- test.class 

Затем перейдите к /home/username/apps/bin и вызвать

java -cp . test 

С -cp добавить текущий каталог для поиска классов. Это всегда должно быть корнем ваших пакетов. Затем обратитесь к основному классу.

BTW: Согласно Java naming conventions, имена классов должны начинаться с прописной буквы, например Test.

Обновление: Обновлено расположение файла класса.

+0

нет, тест - отдельный файл .java, он расположен в одном каталоге выше –

+0

@olzhabala: Я обновил свой ответ. – vanje

+0

отличный мужчина! Большое спасибо! –

0

Вам нужно установить путь к классам двух местах, потому что у вас есть файлы класса в двух разных местах:

  1. /главная/имя пользователя/приложения/(test.class, доступные в данном месте)
  2. /дома/имя пользователя/apps/src/bin (pack.Hello.class и pack.Goodbye.class доступно в этом месте)

Вы можете сделать это с помощью опции -cp команды javac. Вам нужно поставить точку с запятой между несколькими дорожками классов, как показано ниже:

java -cp .;./bin test 
+0

По ошибке я неправильно понимаю структуру папки. Также я написал javac вместо java-команды. Проблема, которую я вижу, заключается в том, что все требуемые классы не находятся в classpath. Используйте параметр -cp для команды java, чтобы указать путь для всех классов. – kamal

Смежные вопросы