Модули Java 9 и JUnit 4

кислородное затмение; Windows 7; JDK 9 финал с 9, 21; JUnit 4.12 и существующее приложение. В качестве отправной точки приложение может быть скомпилировано, выполнено, и все тесты JUnit станут зелеными. Теперь мы используем eclipse для создания файла module-info.java. Результат выглядит так:

module ch.commcity.topsort {
   exports ch.commcity.topsort;

   requires junit;
}

Но с ошибкой: junit не может быть преобразован в модуль. Вопрос: как сообщить файлу, что junit не определяет никакого модуля и его нужно запускать в режиме совместимости?


person juerg    schedule 27.09.2017    source источник
comment
какой фреймворк вы используете в своем проекте? maven / gradle и т.д.? Также какая версия Eclipse Oxygen?   -  person Naman    schedule 27.09.2017


Ответы (3)


Как сообщить файлу, что junit не определяет какой-либо модуль и его следует запускать в режиме совместимости?

Ваш вопрос, похоже, основан на нескольких заблуждениях:

  • Вы не можете сказать module-info.java, определяет ли JUnit модуль или нет. Если модуль говорит, что ему требуется другой модуль, то компилятор ожидает, что этот модуль будет присутствовать - и никак иначе.
  • Является ли JUnit 4 модулем или нет, не слишком важно — если вы поместите его в путь к модулю, он в конечном итоге будет рассматриваться как модуль (возможно, как автоматический).
  • Нет "режима совместимости". Вы можете продолжать писать код так же, как и до модульной системы (почти), но как только вы создадите объявления модуля, вам придется играть по ее правилам.

Я рекомендую внимательно прочитать выдающееся Состояние модульной системы, а затем спросить себя, чего именно вы пытаетесь достичь. Вы действительно пытаетесь создать модуль, зависящий от JUnit? Или это было случайно, потому что вы используете его API для тестирования. Если последнее, вы не должны зависеть от него — вместо этого ваша IDE/инструмент сборки должен выяснить, как компилировать и запускать ваши тесты.

Расширение «модуля, зависящего от JUnit»

Модульная система не классифицирует зависимости как "компилировать" или "тестировать" - если модуль requires другого модуля, он должен присутствовать всегда. Это означает, что модуль, который requires junit будет принудительно использовать JUnit. Если модуль не предоставляет функции, связанные с тестированием, это, безусловно, неправильно.

Другими словами, requires junit похоже на добавление JUnit в POM проекта с использованием compile область.

person Nicolai Parlog    schedule 28.09.2017
comment
Извините, Николай, ни одно из ваших предположений не верно. Посмотрите на мой вопрос. У нас есть небольшой топ-проект. Создан 10 лет назад с Java 5 или 6. Теперь у нас есть Java 9. Мы компилируем и запускаем тесты JUnit на зеленый. Отлично! Теперь мы идем дальше. Мы используем eclipse для создания файла module-info.java. Это позволило бы нам определить алгоритм верхней сортировки как модуль для будущего использования. Таким образом, eclipse создает файл, определяющий верхнюю сортировку модуля и определяющий зависимость JUnit для тестов. Но JUnit, похоже, не находится на пути к модулю. Почему и как исправить, вот в чем вопрос. - person juerg; 30.09.2017
comment
Было бы полезно, если бы вы указали, какие из моих предположений неверны - все три пункта являются надежными, а остальные в основном вызывают вопросы. Вы пишете Итак, eclipse генерирует файл, определяющий модуль «topsort» и определяющий зависимость JUnit для тестов - если topsort не является библиотекой тестирования, вам не нужна эта зависимость. Я отредактировал свой ответ, чтобы дать объяснение. - person Nicolai Parlog; 30.09.2017
comment
Я говорю о ваших предположениях w.r.t. моя проблема. Вы упомянули пом. Это не проект maven. Сценарий муравья существует для тестирования и создания банки. Повторяю, вопрос в том, как указать eclipse поместить библиотеку JUnit в путь к модулю. Я только что прочитал что-то о переключении в пути сборки записи Module:No для чтения Module:Yes. Я попробовал это в определении пользовательской библиотеки junit.jat и org.hamcrest.core_1.3.0v... Я нашел такую ​​запись, но ничего нельзя переключить. Я использую патчи для Oxygen: 1.1.1.v20170826-0521_BETA_JAVA9 и 1.1.1.v20170826-0521_BETA_JAVA9. - person juerg; 30.09.2017
comment
Я не предполагаю, что у вас есть проект Maven, я использую его в качестве примера, чтобы прояснить, почему требование junit, безусловно, неправильно (и мы даже не говорили о том, что не следует публиковать никакую библиотеку, которая ссылается на модуль по имени производный от имени файла). Я предположил, что topsort (можете ли вы дать ссылку на проект?) не является библиотекой, связанной с тестированием. Если это правильно, ответ в силе. - person Nicolai Parlog; 30.09.2017
comment
JUnit — это среда тестирования. Интересно, как вы пришли к выводу, что сгенерированное затмение требует определения junit в файле module-info.java, полученном из имени файла. Не очень надежное предположение и в любом случае не относящееся к делу вообще. Я подозреваю, что плагин eclipse BETA для Java9 все еще имеет некоторые ошибки. Это Бета, ну и что. Я опубликовал случай с единственной целью найти кого-то, кто уже знает, как обойти проблему. В этом-то и дело. - person juerg; 30.09.2017
comment
Интересно, как вы пришли к выводу, что сгенерированное затмение требует определения «junit» в файле module-info.java, полученном из имени файла. Потому что я знаю, как работают автоматические модули. Да, в подключаемом модуле Eclipse могут быть ошибки, но если topsort не является библиотекой для тестирования, вы все равно делаете неправильные вещи в зависимости от JUnit. - person Nicolai Parlog; 30.09.2017
comment
Извините, Николай, ваш комментарий бесполезен. Вы пытаетесь учить, не зная. С тех пор я привык скрывать все, что не обязательно должно быть видно извне, очень ограничительно используя публичность. Вы не можете протестировать класс только с видимостью пакета, если только ваш тестовый класс не находится в том же пакете. Не больно. С помощью Ant или Maven легко создать то, что вы хотите. Eclipse склонен позволять устанавливать путь к модулю в свойстве «Java Build Path/Libraries». У меня есть самая последняя бета-версия плагина, но она пока не работает или уже не работает! Надеюсь случай не забыт и будет работать с Oxygen SP1! - person juerg; 02.10.2017
comment
Юрг, если вам действительно нужна помощь, то вы должны признать, что другие люди могут знать о системе модулей больше, чем вы - возможно, это помогает понять, где я вписываюсь. Мой аргумент не касается Eclipse или того, как вы организуете свой код или тесты — это категорический аргумент против включения тестовых зависимостей в объявление вашего модуля. Если вы сделаете это, то все пользователи topsort будут вынуждены иметь JUnit на пути к модулю во время обычного выполнения (т.е. не только при тестировании). Это действительно то, что вы хотите? - person Nicolai Parlog; 02.10.2017
comment
Краткий ответ: удалите requires junit; из module-info.java. Более длинный ответ: ваш тестовый код не принадлежит полученной банке времени выполнения. Таким образом, ваша банка времени выполнения, в свою очередь, не зависит от junit. Реальный ответ: постарайтесь понять, что сказал Николай, он абсолютно прав и знает, о чем говорит. - person rgielen; 02.10.2017
comment
Я согласен, что требуется junit в файле module-info.java, возникла неизвестная ранее проблема. По-видимому, сейчас требуются 2 файла module-info.java. Один для тестовой фазы и один для сборки дистрибутива без тестов JUnit. Я знаю об этом, как и прежде! Но это следующий шаг, а не момент. Первая цель — запустить тесты JUnit в eclipse с определенным файлом modul-info.java так же, как это работало раньше. Это не так! Второй выпуск Ant пока не работает. В этом суть. Я просто волнуюсь, это не будет исправлено до 10.11! - person juerg; 04.10.2017

Во-первых, обновите поддержку Java 9 для Eclipse Oxygen или воспользуйтесь последняя доступная сборка-кандидат на выпуск для Eclipse 4.7.1a (будет выпущена в октябре 11, 2017).

Чтобы добавить библиотеку или контейнер в путь к модулям проекта Java 9 в Eclipse, откройте диалоговое окно проекта Java Build Path. На вкладке Библиотеки выберите узел Modulepath и добавьте в него свою библиотеку. Обязательно сначала удалите эту библиотеку из узла Путь к классам, если она там уже присутствует.

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

Узел пути к модулю

person Noopur Gupta    schedule 03.10.2017
comment
Будьте уверены, у меня есть последний доступный БЕТА-плагин для Java 9. Я обнаружил froject из eclipse, затем удалил все .x-файлы, такие как .classpath, .project и папку .settings на HD. Затем я снова открыл проект в eclipse. В результате junit теперь виден затмением! - person juerg; 04.10.2017
comment
Я также изменил файл eclipse.ini, чтобы начать с Java 9. Пока это работает. Я также начал тесты JUnit с eclipse. что-то произошло, но без показа ни результата, ни ошибок. Я пытался использовать JUnit 5 вместо 4, но, похоже, это требует дополнительной адаптации. В.р.т. Ant, ant по-прежнему не может скомпилировать module-info.java. Фактически, муравей все еще использует компилятор Java 8. Хотя я пытался сказать муравью использовать java 9, у меня пока не было успеха. Заключение, Java 9, модули, + JUnit + ant, кажется, все еще остается проблемой. Я не уверен, что все эти вопросы удастся решить до 11 октября. - person juerg; 04.10.2017
comment
На вашем изображении показан подэлемент «Модульный» в Junit. Это отсутствует в моей среде IDE, хотя я не могу получить более новый плагин BETA. У меня установлена ​​версия 1.1.1.v20170826-0521_BETA_JAVA9. После 10.11 я скачаю 4.7.1(a) и посмотрю, что изменилось. А до тех пор я буду держать другие камни скатывающимися! - person juerg; 04.10.2017
comment
@juerg v20170826 означает, что у вас есть изменения от 26 августа 2017 года. Я не уверен, почему вы не можете получить более новые обновления от октября 2017 года. Вероятно, вам следует начать с новой установки Eclipse и выполнить шаги, описанные в записи на рынке Eclipse или просто скачайте сборку 4.7.1a RC2 прямо сейчас. Если вы все еще видите какие-либо проблемы, я предлагаю открыть отчет об ошибке для Eclipse. - person Noopur Gupta; 04.10.2017
comment
Спасибо за подтверждение. Я согласен. Да пробовал несколько раз обновить. Не работает. Я видел загрузку 4.7.1a RC2, но не качал. Я жду 10.11, потому что у меня также есть плагины C++ для разработок JNI. Это означает некоторую дополнительную работу, поэтому нет времени делать это дважды. В любом случае, цель состоит в том, чтобы получить некоторый опыт работы с Java 9 и модулями. Я вернусь на следующей неделе, и если я увижу проблемы с моим небольшим красивым уже модульным проектом из 2007 года, я сообщу. - person juerg; 05.10.2017
comment
а) Можно ли добавлять записи в путь к модулю с помощью плагина maven и M2E или б) это нужно делать вручную? До сих пор файл pom.xml был моим основным местом для определения проекта. Поэтому я бы предпочел включить эту информацию и в pom.xml. - person Stefan; 11.11.2017
comment
@kleopatra Честно говоря, я сдалась! w.r.t. мой первый вклад, это была ошибка бета-плагина, которая устранена в версии 1a. Пока у вас не определен файл module-info.java, вы можете добавить библиотеку junit либо 4, либо 5 к пути к классам или к пути к модулю. Тест можно запустить в любой конфигурации. Следующим шагом было позволить eclipse сгенерировать файл. Контент является экспортом вашего модуля и требует junit или org.junit.jupiter.api. Но теперь тесты больше нельзя запускать. Это приводит к тому, что «Тесты не найдены с тестовым бегуном« Junit 5 »»! - person juerg; 25.11.2017
comment
Вы нажимаете bugs.eclipse.org/bugs/show_bug.cgi?id=525948, который планируется исправить в выпуске Eclipse Oxygen.3 (4.7.3). - person Noopur Gupta; 25.11.2017
comment
@kleopatra проект, который я проверил для тестирования головоломки, был сначала написан с использованием Java 1.4 или старше. Ant позволял проводить тесты, генерировать отчеты и javadoc, а дистрибутивную банку можно было сгенерировать без junit, необходимого для тестов. До Java 8 это все еще работает. А вот для java 9 и вообще с лобзиком пока нет. Maven также не может справиться с головоломкой. Следовательно, впереди еще много работы. В любом случае, java 9 по-прежнему недоступен для Arm 32. Пусть настоящее поле битвы с C++, JNI и java 8! C++ — самая сложная его часть! :)) Головоломка откладывается. - person juerg; 25.11.2017

Как сообщить файлу, что junit не определяет какой-либо модуль и его следует запускать в режиме совместимости?

Поскольку модуль junit сгенерирован в module-info будет автоматическим модулем преобразован из своего артефакта. Вам нужно убедиться, что jar для Junit junit:junit:4.12 доступен в пути к модулям вашего проекта, и модуль будет разрешен сам.

Чтобы убедиться в вышеизложенном, вы можете проверить зависимости вашего проекта/модуля, настроенные в IDE, чтобы включить junit:4.12:jar.

person Naman    schedule 28.09.2017
comment
JUnit находится в пути к классам IDE, иначе тесты не были бы зелеными! Но, очевидно, это не путь к классам w.r.t. определение модуля. Отсюда вопрос, как это можно проверить, и где это можно настроить. Я конечно могу подождать до 11 октября и результатов SP1 для Oxygen, надеюсь тогда баг исчезнет. Тем не менее мне любопытно узнать, можно ли это исправить раньше. - person juerg; 28.09.2017
comment
Он должен быть на пути к модулю, чтобы стать автоматическим модулем. - person Nicolai Parlog; 28.09.2017
comment
@ Николай Ага, исправлено. from classpath в любом случае был бы безымянным модулем. - person Naman; 28.09.2017