java.lang.Не найдено исключение при запуске java из командной строки

#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/*