Maven скомпилировал и предоставил области для модульного тестирования JPMS-модуля с surefire-плагином - PullRequest
0 голосов
/ 24 апреля 2020

Пытаясь протестировать мой проект maven (один родительский pom и несколько модулей (jpms-модули)), меня раздражает Error occurred in starting fork:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M4:test (default-test) on project com.foo.plugin: There are test failures.
...
Error occurred in starting fork, check output in log
Process Exit Code: 1
org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
...
Error occurred in starting fork, check output in log
Process Exit Code: 1
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:690)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:285)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:248)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1217)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1063)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:889)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginM

Решение, которое я нашел, например, здесь предложил установить <forkCount>0</forkCount> в верной конфигурации плагина. Однако такое решение не позволяет запускать тесты по пути к модулям, поэтому я обратился к этой безошибочной проблеме .

Разработчики Surefire (благодаря им) выяснили, что причина была в maven область зависимостей, которые я использовал. В моем проекте у меня есть:

         <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>2.1.6</version>
            <scope>provided</scope> <!-- NOTE IT -->
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>2.3.2</version>
            <scope>provided</scope> <!-- NOTE IT -->
        </dependency>

И они сказали, что это должно быть:

          <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>2.1.6</version>
            <scope>compile</scope> <!-- NOTE IT -->
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>2.3.2</version>
            <scope>compile</scope> <!-- NOTE IT -->
        </dependency>

И когда я изменил сферу действия, мой проект был проверен верным без проблем. Обе зависимости jakarta.ws.rs-api и jakarta.xml.bind-api являются модулями JPMS и required моими модулями JPMS.

Итак, вопрос в том, является ли проблема в моем коде (provided неверна, если я хочу запустить свои тесты для моего модуля JPMS), или проблема в плагине surefire?

1 Ответ

0 голосов
/ 24 апреля 2020

ПРИМЕЧАНИЕ. Вы можете свободно удалить <scope>compile</scope>, так как отсутствие объявления области в вашем POM означает, что Maven все равно будет использовать значение по умолчанию compile.

Область действия - это аспект архитектуры проекта .

Используется в ситуациях, когда сервер приложений содержит WS API (даже если другое имя файла артефакта). Таким образом, мы помечаем его provided, что уменьшает размер файла WAR, и артефакт WS API не будет включен.

В ситуациях, когда вы также создаете приложение без сервера и создаете свой собственный контейнер, тогда нет области действия. provided необходимо объявить. Там в Fat JAR появится артефакт, который вы ожидаете.

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

В области действия provided есть еще одна функция. Это наследование, при котором такая зависимость не может быть унаследована транзитивно. Если у вас есть такая зависимость с областью, предоставленной в POM, то наследование не увидит зависимость в зависимом дочернем POM.

Для получения дополнительной информации см. Документацию Maven.

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

Эта область доступна только для пути к классам компиляции и тестирования и не является переходной.

...