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 внешняя библиотека:

проект intelliJ

Мой класс, который использует внешние библиотеки, 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 - все требуют ошибки времени компиляции при любой попытке импортировать тип (или его статический член) в безымянный пакет.

Чтобы получить доступ к этим классам извне пакета по умолчанию без изменения библиотеки, вам нужно будет использовать отражение.

Кроме того, причина, по которой вам не нужен импорт, когда ваш класс находится в пакете по умолчанию, заключается в том, что вам не нужно импортировать классы, когда они находятся в одном пакете.

Боюсь, это невозможно. В частности, вы не можете "импортировать" пакет по умолчанию в именованный пакет. Поскольку используемая вами библиотека имеет свои классы в пакете по умолчанию, единственным выходом для вас является использование пакета по умолчанию, если вы хотите использовать библиотеку.

Конечно, вы можете переместить классы библиотеки в пакет, но это уже другая история.

Другие вопросы по тегам