Один существующий проект Java Maven неожиданно не генерирует файл .classpath в Eclipse - PullRequest
3 голосов
/ 05 марта 2020

Я использую Eclipse 2019-12 со дня его выпуска. У меня есть несколько связанных проектов, все из которых - проекты SpringBoot Java Maven, которые были импортированы из моих локальных git репозиториев.

В общем, все они отлично работают.

Вчера я обнаружил, что не могу запустить модульные тесты в Eclipse для одного конкретного проекта. Этот проект находился в моей рабочей среде довольно долгое время, и я работаю с ним почти каждый день, включая запуск модульных тестов. Вчера я увидел, что все мои попытки провалились, потому что не удалось найти файл тестового класса. Другие подобные проекты не имели проблем с этим. Я просмотрел настройки для проекта, и ничего неожиданного не было. Каталог src / test / java был исходным каталогом, и я мог использовать «Open Type», чтобы открыть тестовый класс. Я пытался сделать "Обновление Maven". Без изменений. Запуск "mvn package" из оболочки работает нормально, и я ясно вижу, что он выполняет все модульные тесты.

Я попытался удалить проект и повторно импортировать из git. Без изменений.

Затем я снова попытался удалить проект, затем вручную удалил файлы и папки .project, .classpath и .settings, а затем импортировал их из git. Это сделало это хуже. Изначально он даже не знал, что это был проект Java.

Затем я снова удалил проект и отредактировал файл .project из другого редактора. Я сравнил его с одним из других файлов .project. У него был только «maven2Builder» и не было «javabuilder» или «springbootbuilder». Он также имел только «maven2nature» и не имел «javanature» или «groovyNature». Я вручную скопировал эти элементы из другого файла .project и повторно импортировал проект.

В этот момент он знал, что это проект Java, но он только добавил root "sr c" директория в качестве единственной исходной папки, вместо src / main / java, src / test / java и других. Я также отметил, что у него все еще нет файла .classpath. Итак, я снова удалил проект и создал файл .classpath с помощью внешнего редактора. Я скопировал в файл .classpath из соответствующего проекта. Структура двух проектов была идентична, поэтому для этого едва потребовались какие-либо изменения (у другого проекта была одна дополнительная исходная папка, которой у этого проекта не было, поэтому я удалил эту запись). Затем я снова импортировал проект.

Теперь проект "выглядит" нормально в проводнике пакетов. Тем не менее, я все еще не могу выполнить модульные тесты в этом классе. Я прошел полный круг. Я могу открыть тестовый класс с помощью «Open Type», но выполнить его не удается с помощью ClassNotFoundException в консоли.

Если я ищу определенный файл тестового класса в оболочке, я нахожу его в ожидаемых местах в и «bin», и «target / test-classes», в правильном каталоге пакета.

Я посмотрел в журнале ошибок Eclipse, и там не было ничего существенного.

Любопытно, что я ' я не вижу проблем с "Run / Debug As ... Spring Boot App". Это находит все необходимые файлы классов и запускается нормально. Я просто не могу запустить юнит-тесты.

Я не знаю, что еще попробовать.

Обновление :

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

Затем я искал файл рабочего класса в оболочке в рабочем проекте, и что было любопытно, я НЕ нашел его в дереве «bin». Фактически, рабочий проект даже не имел каталога bin. Затем я убедился, что в обоих проектах свойства проекта даже не ссылаются на каталог «bin», включая любую из «папок вывода».

Итак, я снова удалил проект, затем удалил каталог «bin» из оболочки и заново импортировал проект. К сожалению, до сих пор нет изменений в общем симптоме. Он все еще получает ClassNotFoundException при попытке запустить тестовый класс.

Обновление :

Я работаю на Windows 10, и я решил попробовать использовать SysInternals ProcMon отслеживать системные вызовы (например, Linux (s / d) trace), пока я пытаюсь запустить тест. Я отфильтровал название тестового класса. Результат показал одну возможную подсказку.

Это несколько ошибочное изображение списка событий, которые я видел в procmon, когда я запускал модульный тест:

procmon output

Я не знаю, почему операция называется «Создать файл», но я отмечаю, что здесь указывается путь к папке «target / classes», а не «target / test-classes». Несмотря на то, что файл классов находится в дереве «target / test-classes», я не видел ни одного системного вызова, ссылающегося на этот каталог, только «target / classes».

Update :

Я попытался выполнить шаги по ручному созданию конфигурации запуска JUnit. Когда я впервые выбрал работающий проект, а затем щелкнул «Поиск» в поле «Тестовый класс», он вызвал диалог со многими классами в списке «Соответствующие элементы». Когда я вместо этого выбрал проект, в котором возникла эта проблема, а затем щелкнул ту же кнопку «Поиск», список «Соответствующих элементов» в диалоговом окне был пустым. Я не уверен, что делать с этим фактом.

Обновление :

Я решил попробовать добавить больше многословия, когда он пытается запустить класс модульного теста, оба в рабочем проекте и НЕ рабочем проекте. В обеих конфигурациях запуска я добавил «Xdiag -XshowSettings».

Когда я сравнил результаты, я обнаружил, что оба показали значение «java .class.path», включающее все ожидаемые каталоги, являющиеся « target \ test-classes "и" target \ classes ", даже тот, который НЕ работает. Однако обратите внимание на очень тонкую разницу:

Рабочая:

java.class.path = C:\Users\<myuid>\git\futurebillestimatorms\target\test-classes
    C:\Users\<myuid>\git\futurebillestimatorms\target\classes

НЕ работает:

java.class.path = "C:\Users\<myuid>\git\checkoutms\target\test-classes
    C:\Users\<myuid>\git\checkoutms\target\classes

Обратите внимание на разницу в один символ, двойная кавычка в начале значение в НЕ рабочем образце. Соответствующая двойная кавычка находится в конце длинного списка записей пути к классам. Тот, который работает, не имеет этих двойных кавычек. Двойные кавычки вокруг значения java .class.path являются единственными двойными кавычками в любом месте вывода.

Обновление :

Ok. У меня есть обходной путь. Это проблема в Windows с выпуском 2019-12. Это сообщение об ошибке, описывающее проблему: https://bugs.eclipse.org/bugs/show_bug.cgi?id=558495.

Самый простой способ для меня на данный момент - установить флажок «Использовать временную банку» в конфигурации «Выполнить».

...