#java #javac
#java #javac
Вопрос:
Я пытаюсь понять использование java
и javac
лучше компилировать и запускать приложения из командной строки.
Структура моего проекта следующая:
lib
- mylibrary.jar
out
at
mypackage
- Main.class
src
at
mypackage
- Main.java
.jar
Файл просто содержит класс at/mylibrary/Test.class
.
Из src
каталога, который я запускаю:
javac -cp "../lib/*" -d "../out" at/mypackage/Main.java
Кажется, это работает. out
Каталог и все его содержимое созданы. Теперь я перехожу в out
каталог и пытаюсь его запустить:
java -cp "../lib/*" at.mypackage.Main
Вот где я получаю java.lang.ClassNotFoundException
. at.mypackage.Main
Не удается найти основной класс.
Это содержимое Main.java
:
package at.mypackage;
import at.mylibrary.Test;
public class Main {
public static void main(String[] args) {
System.out.println(Test.hello());
}
}
Внутри .jar
файла есть только этот один класс:
package at.mylibrary;
public class Test {
public static String hello() {
return "Hello!";
}
}
Где я ошибся? Как выполняется компиляция и запуск этого проекта с javac
помощью и java
из командной строки?
PS: Я знаю, что это намного проще, особенно для более крупных проектов, сделать это с помощью встроенного инструмента управления, такого как Maven, но я действительно хочу узнать немного больше о том, как это работает в целом. Я искал предложения в StackOverflow, но не смог заставить его работать.
РЕДАКТИРОВАТЬ: я заставил его работать. Я перешел в out
каталог и выполнил Main
следующую команду:
java -cp ".:../lib/*" at.mypackage.Main
Я не знаю, что я ошибся в первый раз, но теперь это сработало. Как было предложено в комментариях, вы должны включить текущий каталог .
в путь к классу, потому что, когда вы указываете путь к классу через -cp
путь к классу по умолчанию, который включает текущий каталог, переопределяется. По крайней мере, так я это понимаю. :
отделяет каталоги друг от друга.
Комментарии:
1. Вам нужно добавить каталог ‘out’ (
.
) в свой путь к классу2. Итак, команда будет
java -cp ".:../lib/*" at.mypackage.Main
? К сожалению, я все еще получаю ту же ошибку3. Да, я заметил это до того, как вы ответили и отредактировали его. Я пробовал
:
, и это тоже не работает4. Возможно, это как-то связано с тем, как я создаю
.jar
файл? Потому что, когда я изменяю код,Main.java
чтобы вообще не обращаться к.jar
файлу, работает компиляция и запуск основного класса. Я просто создаю его, как я видел на docs.oracle.com/javase/tutorial/deployment/jar/build.html сjar mylibrary.jar at/mylibrary/*