У меня проблемы с пониманием того, как работают пакеты. Не использую никакую IDE.
У меня есть следующая структура папок: ~/dropbox/api/данные
Внутри папки данных находятся (только) Producer.java, Consumer.java.
api
├── data
├── Consumer.java
├── Producer.java
└── Producer.class
package data;
public class Producer {
public static void main(String[] args) {
//do some production
}
public static Producer getProducer() {
//call constructor and return instance
}
}
----------------
package data;
public class Consumer {
public static void main(String[] args) {
Producer worker = getProducer();
}
}
Я cd
в папку данных и javac Producer.java
скомпилирую Producer.class в той же папке. Затем, когда я запускаю java Producer
, я получаю сообщение об ошибке: не удалось найти или загрузить основной класс Producer.
Вызвано: java.lang.NoClassDefFoundError: Producer (неправильное имя: data/Producer).
Та же ошибка, когда я попробовал java Producer
и java data.Producer
из родительской папки api
и java data.Producer
в папке data
.
package data;
, он компилируется (javac) и нормально запускается (java) в папке данных.Кроме того, когда я попробовал javac Consumer.java
, я получил ошибку: не могу найти производителя символа. Они находятся в одной папке и объявлены в одном пакете.
Команда java
требует, чтобы вы указали полное имя класса. Итак, java Producer
никогда не сработает; вы должны ввести java data.Producer
.
Но это не все.
Пакет следует реж. Итак, когда вы вводите java data.Producer
так, как необходимо, Java пытается загрузить data/Producer.class
из каждой записи в пути к классам. По умолчанию текущий каталог находится в пути к классам, но если вы возились, например. переменная среды CLASSPATH
может быть не так. Чтобы убедиться, что проблема не в этом, java -cp . data.Producer
.
Та же ошибка, когда я попробовал Java Producer и Java data.Producer из родительской папки API,
Нет, ты там как-то напутал. java data.Producer
из папки API будет работать. На всякий случай попробуйте java -cp . data.Producer
(и если это сработает, исправьте все, что вы напутали, с помощью переменной CLASSPATH
. Или просто привыкните к этому, это неплохая идея).
Кроме того, когда я попробовал javac Consumer.java, я получаю сообщение об ошибке: не могу найти производителя символа.
Та же проблема, вам нужно запустить javac data/Consumer.java
из каталога API.
Есть причина, по которой вы не используете javac
напрямую, а вместо этого используете инструмент сборки или IDE.
Должен ли я переместить папку com
из historicalData
в родительскую папку ibapi
, чтобы historicalData
и com
были братьями и сестрами? Все исходные файлы внутри com/ib/client
объявлены package com.ib.client
, значит import com.ib.client
внутри HistoricalDataDownloader.java должно работать?
@limestreetlab Я предлагаю вам использовать IDE (IntelliJ, Eclipse, NetBeans, VS Code и т. д.) и, возможно, инструмент сборки (Maven, Gradle и т. д.). Это облегчит разработку нетривиальных Java-приложений. Тем не менее, если ваш код зависит от сторонней библиотеки, вам необходимо указать на нее при компиляции (и запуске) вашего приложения. См. варианты -cp
/ -classpath
/ --class-path
или -p
/ --module-path
. Хотя вы говорите «источник», возможно, вам действительно нужен -sourcepath
/--source-path
? Зависимости примечаний в Java практически всегда предварительно компилируются, так что это было бы нетипично.
cd ~/dropbox/ibapi;find . -name \*.class -exec rm '{}' \;tree .
и опубликовать результат в виде отформатированного кода.
@limestreetlab dropbox/ibapi
— это «корень» вашего кода, но dropbox/ibapi/historicaldata
— это корень файлов com.ibm. Это не сработает. historicaldata
— пакет высшего уровня. com — это пакет верхнего уровня. Оба каталога не являются родственными друг другу. В ошибках на вашем скриншоте следует сосредоточиться на части com.ibm not found
. Не часть «невозможно загрузить класс» — она не может загрузить ваш класс, ПОТОМУ ЧТО com.ibm не найден. Если у вас с этим проблемы: прогуляйтесь, прежде чем бежать. Создайте очень простой исходный Java-файл на основе пакета с нулевым значением глубины и работайте с ним.
Я добавил скриншот. Структура папок
ibapi/historicalData
, в которой естьHistoricalDataDownloader.class, com folder
. Внутри HistoricalDataDownloader.java у меня естьimport com.ib.client.*
Кажется, ошибка связана с этим импортом. Когда я удаляюpackage historicalData
, все работает нормально. Этотcom/ib/client/*
содержит сторонний исходный код, необходимый для запускаHistoricalDataDownloader
класса.