IntelliJ: Как использовать внешние JAR в качестве библиотеки, когда у JAR нет пакетов
Этот вопрос связан с настройкой среды IntelliJ для курса Princeton's Algorithms 2, доступного на Coursera.
Я пытаюсь импортировать внешние библиотеки, как JAR-файлы, в мой проект. Мне удалось добавить файлы JAR из меню "Структура проекта" через Project Structure
-> Libraries
-> New Project Library (the green plus sign)
, Теперь у меня есть класс под src
, WordNet.java
, но я могу получить доступ только к своим внешним библиотекам, используя пакет по умолчанию (т.е. без пакета). Я хотел бы создать пакеты для организации своего кода, но как я могу импортировать внешние библиотеки из пакета? Есть ли простое решение для прямого импорта файлов JAR или, возможно, я могу использовать Maven или Grails? Предоставление простого ответа на все мои варианты было бы здорово.
У меня есть следующая структура проекта, с src
каталог, src/assignemnt1
пакет и External Libraries/stdlib/stdlib.jar
внешняя библиотека:
Мой класс, который использует внешние библиотеки, WordNet.java
, имеет следующий код:
public class WordNet {
// constructor takes the name of the two input files
public WordNet(String synsets, String hypernyms) {
In read_synsets = new In(synsets);
read_synsets.hasNextLine();
}
}
куда In
это класс под stdlib.jar
, Под пакетом по умолчанию я могу использовать In
без импорта. К сожалению, если у меня есть WordNet.java
под src/assignment1
(внутри assignment1
пакет), я не могу импортировать In
и IntelliJ также не предлагает предложений по импорту. Есть ли способ использовать stdlib.jar
в WordNet.java
, внутри src/assignment1
пакет? Или я должен остаться с пакетом по умолчанию?
2 ответа
Спецификация языка Java запрещает любой импорт из неназванного пакета или пакета по умолчанию.
Тип в неназванном пакете (§7.4.2) не имеет канонического имени, поэтому требование канонического имени в каждом виде объявления импорта подразумевает, что (a) типы в неназванном пакете не могут быть импортированы, и (b) статические члены типы в неназванном пакете не могут быть импортированы. Таким образом, §7.5.1, §7.5.2, §7.5.3 и §7.5.4 - все требуют ошибки времени компиляции при любой попытке импортировать тип (или его статический член) в безымянный пакет.
Чтобы получить доступ к этим классам извне пакета по умолчанию без изменения библиотеки, вам нужно будет использовать отражение.
Кроме того, причина, по которой вам не нужен импорт, когда ваш класс находится в пакете по умолчанию, заключается в том, что вам не нужно импортировать классы, когда они находятся в одном пакете.
Боюсь, это невозможно. В частности, вы не можете "импортировать" пакет по умолчанию в именованный пакет. Поскольку используемая вами библиотека имеет свои классы в пакете по умолчанию, единственным выходом для вас является использование пакета по умолчанию, если вы хотите использовать библиотеку.
Конечно, вы можете переместить классы библиотеки в пакет, но это уже другая история.