Обучение и трудоустройство Java-программистов от Junior до Senior

Командная строка, -classpath, пакеты

 
 
 
Сообщения:3
Проблема решена случайно-самостоятельно и оказалась глупейшей!!!! После ключа -cp и путями нужно ставить точку с запятой!!!! Невнимательность моя забрала несколько дней. Зато приобрёл некоторые профессиональные навыки и научился работать с командной строкой. Может быть кому-то пригодитс

Доброго времени суток. Пытаюсь научиться импортировать библиотеки через javac и java. Но не получается. Нужна помощь опытного программиста.
На диске C:\ создал папку projects. В папке projects две папки - bin и src. В папке src подпапки com\albert\hello. Внутри папки Hello создал класс и скомпилировал:
package com.albert.hello;

public class Hello {
  public static void main(String[] args) {
    System.out.println("class 'Hello'");
  }
}

и сохранил данный класс в папке C:\projects\bin\com\albert\hello.
Я создал на диске C:\ папку sidelib. Проделал точно такие же махинации: папки bin и src. В папке src com\sl\OtherClass.java. И такой код:
package com.sl;

public class OtherClass {
  public static void main(String[] args) {
    System.out.println("com.sl.OtherClass");
  }
}

Сохранил все это в C:\sidelib\bin\com\sl\OtherClass.class
Создал в директории C:\projects\src файл Main.java . Скомпилированный класс поместил в C:\projects\bin\ Main.class. Код такой:
import com.albert.hello.*;
import com.sl.*;

public class Main {
  public static void main(String[] args) {
    Hello h = new Hello();
	OtherClass oc = new OtherClass();
    h.main(new String[] { "", "", });
    System.out.println("Yeah!");
  }
}

В командной строке ввел команду
Quote:
C:\projects>javac -d bin src\Main.java -sourcepath src -classpath C:\projects\bin;C:\sidelib\bin
и программа компилируется. В папке C:\projects\bin соответственно появился Main.class. Теперь когда я пытаюсь запустить этот класс через команду
Quote:
C:\projects\bin>java Main -classpath C:\projects\bin;C:\sidelib\bin\

То выходит следующая кракозябра:
Quote:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sl/OtherClass
at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: com.sl.OtherClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Подскажите пожалуйста, что я делаю не так? Я столько вариантов перепробовал, что уже не знаю, что делать.
P.S. И даже когда я создаю jar-архив и помещаю полный путь к нему в -classpath, то выходит точно такая же ошибка
Quote:
C:\projects\bin>java Main -classpath C:\projects\bin;C:\sidelib\bin\com\sl\oc.jar
Exception in thread "main" java.lang.NoClassDefFoundError: com/sl/OtherClass
at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: com.sl.OtherClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Изменен:13 окт 2017 05:49
 
 
Сообщения:87
На этом же форуме находил инструкцию, которая мне помогла. Заранее извиняюсь перед автором того поста, что не указываю его имени - сохранил себе только инструкцию. Единственное замечание - когда будете запускать откомпилированный класс, учитывайте ещё и имя пакета. То есть если класс находится в пакете (он, кстати будет находится в папке, которая по имени совпадает с именем пакета), то вводить на запуск надо так: java -cp . packet_name.Main

"Давайте! Итак:
1. создаем три исходника: Ball.java, BallComponent.java и BounceThread.java. положим их в какую-нибудь отдельную папку, например java
2. заходим в эту папку из командной строки (делаем ее текущей)
cd java

3. создаем в этой папке папку classes для файлов классов
mkdir classes

4. теперь скомпилируем исходники в папку classes. можно это делать по-одному (по-очереди), но это долго, да и не всегда помнишь,
что нужно скомпилировать в первую очередь, а что потом. так что делаем все одной командой
javac -d ./classes *.java

ключ -d говорит компилятору, куда складывать class файлы.
5. сделаем текущей директорию classes
cd classes

6. запустим класс, содержащий метод main
java -cp . BounceThread

опция -cp (classpath) говорит интерпретатору, где искать классы, требующиеся при выполнении метода main.
classpath это также переменная окружения, можно задать в настройках командного интерпретатора,
или командой CLASSPATH="$CLASSPATH:(your_path_to_classes)".. это в *nix, как в винде не помню.

наслаждаемся летающими шариками!"
 
 
Сообщения:3
vallball:
На этом же форуме находил инструкцию, которая мне помогла. Заранее извиняюсь перед автором того поста, что не указываю его имени - сохранил себе только инструкцию. Единственное замечание - когда будете запускать откомпилированный класс, учитывайте ещё и имя пакета. То есть если класс находится в пакете (он, кстати будет находится в папке, которая по имени совпадает с именем пакета), то вводить на запуск надо так: java -cp . packet_name.Main

"Давайте! Итак:
1. создаем три исходника: Ball.java, BallComponent.java и BounceThread.java. положим их в какую-нибудь отдельную папку, например java
2. заходим в эту папку из командной строки (делаем ее текущей)
cd java

3. создаем в этой папке папку classes для файлов классов
mkdir classes

4. теперь скомпилируем исходники в папку classes. можно это делать по-одному (по-очереди), но это долго, да и не всегда помнишь,
что нужно скомпилировать в первую очередь, а что потом. так что делаем все одной командой
javac -d ./classes *.java

ключ -d говорит компилятору, куда складывать class файлы.
5. сделаем текущей директорию classes
cd classes

6. запустим класс, содержащий метод main
java -cp . BounceThread

опция -cp (classpath) говорит интерпретатору, где искать классы, требующиеся при выполнении метода main.
classpath это также переменная окружения, можно задать в настройках командного интерпретатора,
или командой CLASSPATH="$CLASSPATH:(your_path_to_classes)".. это в *nix, как в винде не помню.

наслаждаемся летающими шариками!"
Все дело в том, что у меня проблема именно со сторонним пакетом. То есть с пакетом, который находится в директории отличной от той, где находится main-класс. Помоги пожалуйста разобраться
Изменен:13 окт 2017 04:55
 
 
Сообщения:458
тебе нужно указать CLASSPATH

java -cp path1;path2 Main

ЗЫ. начинать программировать действительно лучше в блокноте, понимаешь, что ты не придаток к ИДЕ, а программист. но когда количество кода переходит за сотню строчек, появляются дополнительные файлы и пакеты, то пора переходить на ИДЕ.
 
 
Сообщения:87
IDE упрощает знакомство с языком, что на начальном этапе всё-таки важнее. Когда элементарное System.out.println не кажется элементарным, ты тратишь меньше времени на поиски проблем в коде. Но это моё мнение.
Правда, когда пробовал запускать программы вне ИДЕ тоже сталкивался с отрудностями.
 
 
Сообщения:3
Проблема решена случайно-самостоятельно и оказалась глупейшей!!!! После ключа -cp и путями нужно ставить точку с запятой!!!! Невнимательность моя забрала несколько дней. Зато приобрёл некоторые профессиональные навыки и научился работать с командной строкой. Может быть кому-то пригодитс
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет