#unit-testing #maven #jar #package
#модульное тестирование #maven #jar #пакет
Вопрос:
Одному из моих проектов требуется довольно сложная настройка для результирующего файла JAR, поэтому я хотел бы запустить тест после package
фазы, чтобы убедиться, что JAR содержит то, что должен.
Как мне сделать это с помощью Maven 2?
Комментарии:
1. Возможно, стоит взглянуть на Maven Failsafe Plugin — к сожалению, я никогда не использовал его сам и не могу предоставить больше информации по этому поводу.
Ответ №1:
Для этого вы можете использовать surefire-plugin. что вам нужно сделать, так это связать фазу с выполнением (см. Ниже). Вам нужно будет изменить фазу, чтобы она была такой, какой вы хотите, чтобы она была в вашем случае, через одну после фазы упаковки.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>unittests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<skip>false</skip>
<includes>
<include>**/**/**/*Test.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
Комментарии:
1. Вы уверены, что упакованный файл jar будет находиться в пути к тестовому классу вместо скомпилированных классов?
2. @K. Clazen: да, так и будет. Запустите maven с
-X
аргументом для проверки пути к классу.3. @Robert Munteanu После того, как
Building jar: c:meworkspacesdefaultdo-nothing-projecttargetdo-nothing-project-0.0.1-SNAPSHOT.jar
я получаю[DEBUG] Test Classpath : [DEBUG] c:meworkspacesdefaultdo-nothing-projecttargettest-classes [DEBUG] c:meworkspacesdefaultdo-nothing-projecttargetclasses [DEBUG] C:Usersme.m2repositoryjunitjunit4.8.2junit-4.8.2.jar
— похоже, что скомпилированные классы находятся в classpath вместо jar.4. @K. Classen : это были мои воспоминания, странно, что так не происходит…
5. Что вы хотите протестировать в файле jar? Является ли файл jar исполняемым? Не могли бы вы запустить файл jar и протестировать его в рабочем состоянии? Возможно, запустите скрипт через что-то вроде exec:exec и проверьте содержимое jar.
Ответ №2:
Преобразуйте свой проект в многомодульную сборку. В первом модуле создайте свой оригинальный проект. Во втором модуле добавьте зависимость к первому.
Это добавит первый JAR в путь к классу.
Обновление от OP: Это работает, но мне пришлось добавить это в мой POM:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.maven-surefire-plugin}</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
Важная часть заключается в <useSystemClassLoader>false</useSystemClassLoader>
. Без этого мой classpath содержал только пару файлов виртуальной машины плюс файл surefire bootstrap JAR (который содержит путь к тестовому классу в MANIFEST.MF
). Я понятия не имею, почему этот тестовый путь к классу не виден из загруженных из него классов.
Комментарии:
1. тест-артефакт? Вы имеете в виду другой модуль?
2. ДА. Дополнительный артефакт, который потребует недавней сборки вашей библиотеки из репозитория и выполняет проверки на ней.