2017-02-18 2 views
0

Я знаю, что это распространенный вопрос, но я прочитал все остальные ответы и не смог найти решение. Я пытаюсь понять путь Java classpath, но я столкнулся с Error: Could not find or load main class Hello, когда пытаюсь указать внешнюю библиотеку.Java: Ошибка: не удалось найти или загрузить основной класс. Привет, когда пытаюсь импортировать внешнюю библиотеку.

Я начал с этой простой программы, которая находится непосредственно в моем домашнем каталоге:

import java.util.*; 

public class Hello { 
    public static void main(String[] args) { 
     Date date = new Date(); 
     System.out.println("Hello world"); 
    } 
} 

Это компилирует и работает просто отлично ...

[user ~]> ls -l 
Hello.java 
[user ~]> javac Hello.java 
[user ~]> ls -l 
Hello.java 
Hello.class 
[user ~]> java Hello 
Hello world 

... который говорит мне, что переменная среды classpath установлена ​​правильно (потому что она находит пакет java.util).

Но когда я пытаюсь импортировать случайный пакет 3 участника и указать его расположение в -classpath я получаю ошибку:

[user ~]> cat Hello.java 
import java.util.*; 
import org.apache.commons.lang3.time.*; 

public class Hello { 
    public static void main(String[] args) { 
     StopWatch sw = new StopWatch(); 
     Date date = new Date(); 
     System.out.println("Hello world"); 
    } 
} 
[user ~]> ls .m2/repository/org/apache/commons/commons-lang3/3.3.1 
commons-lang3-3.3.1.jar 
[user ~]> javac -classpath ~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello.java 
[user ~]> java -classpath ~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello 
Error: Could not find or load main class Hello 

Может кто-нибудь дать мне представление о том, что я делаю неправильно здесь?

+0

Если не объяснение, определяющее путь к классу, компилятор будет искать в текущей папке. Когда вы определили classpath для внешнего JAR, вы преуспели в том, чтобы сообщать компилятору, где он находится, но затем он игнорировал текущий каталог. –

ответ

1

Сначала классы java.util являются частью самой JRE и поэтому автоматически доступны независимо от класса.

Первый пример работает отлично, потому что вы не указываете какой-либо путь к классу, и используется по умолчанию (это просто ., т. Е. Текущий каталог).

Второй пример указывает путь к классам, но не включает в себя . (текущий каталог), поэтому классы commons-lang доступны во время выполнения, но не ваш класс Hello. Используйте

java -classpath .:~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello 

Кроме того, в будущем:

  • не когда-либо, когда-либо поставить класс в пакете по умолчанию
  • создать структуру реального проекта, содержащий
    • ОСНОВОПОЛАГАЮЩАЯ directory
    • исходный каталог, содержащий файлы .java, правильно организованный в структуре пакета
    • каталог классов, содержащий скомпилированные файлы .class, что вы можете просто ясно, когда вы хотите перекомпилировать все с нуля

Следующим шагом будет, конечно, использовать Gradle или Maven как инструмент для сборки , и следовать их рекомендуемой схеме проекта.

+0

Хорошо, это действительно разочаровывает, я думал, что classpath всегда будет включать текущий каталог автоматически. Обычно я использую Maven и рекомендуемую структуру проекта, я просто задал это как простой эксперимент, чтобы посмотреть под капот. Спасибо за Ваш ответ. – user8793

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