Как запустить модульные тесты с затененными зависимостями? - PullRequest
0 голосов
/ 05 июля 2019

Я сталкиваюсь с неудачами при тестировании проекта maven, который мне не понятен.

Проект maven настроен как многомодульный проект, и он затеняет одну из своих зависимостей (Google Guava, поскольку у Spark есть конфликтующая зависимость для Google Guava).

Ниже приведена упрощенная версия родительского pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    ... other stuff...

    <modules>
        <module>module A</module>
        <module>module B</module>
        <module>module C</module>
        ...
    </modules>

    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>
        ...other dependencies

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <id>relocateGuava</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <relocations>
                                <relocation>
                                    <pattern>com.google</pattern>
                                    <shadedPattern>shaded.com.google</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                    <execution>
                        <id>buildUberJar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
        </plugins>
    </build>
</project>

Ошибка включает в себя следующее:

Caused by: java.lang.ClassNotFoundException: shaded.com.google.common.collect.Multimap
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 22 more

, а строка с ошибкой - это простая инструкция импорта в модулеA: import com.google.common.collect.ListMultimap;.

Структура зависимостей выглядит следующим образом: - модуль B - это тот, чьи тесты не пройдены - модуль B называет модуль A зависимостью - модуль A включает в себя этот оператор импорта

Вот упрощенная версияpom модуля B:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <dependencies>
        <dependency>
            module A
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.7</version>
                <executions>
                    <execution>
                        <id>default-deploy</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

I думаю , что может произойти, так это то, что тесты модуля B запускаются до того, как его зависимости затенены.Так что в основном тестируемый код модуля B не включает затененные зависимости в пути к классам.Однако B зависит от A, и код A переписан так, чтобы указывать на затененные зависимости, а не на исходные зависимости.Поэтому, когда B включает код A, он включает код, который указывает на затененные зависимости, и эти затененные зависимости недоступны для B.

Вопросы: - Это то, что происходит?- Как я могу это исправить?

(Если вы не можете сказать, я очень неопытен как с Java, так и с Maven)

РЕДАКТИРОВАТЬ: также добавит, что mvn package успешно - только mvn test не удается.

1 Ответ

0 голосов
/ 05 июля 2019

Я думаю, вы ошиблись версией google-guava, вы можете попробовать три способа:

  1. Удалить локальный каталог google-guave, который хранится в вашем локальном mavenхранилище и заново импортируйте все зависимости вашего проекта, я использовал этот способ для решения своей проблемы много лет назад.

  2. Выполните установку maven для модуля A, так что вы можете найти модуль A вв вашем локальном репозитории maven, если maven install получает ошибку для модуля A, в модуле A должно быть что-то не так, поэтому мы можем исключить проблему модуля B.

  3. Явно определить зависимость google-guava в модулеB, поэтому, когда вы запустите тестовый пример, maven получит зависимость google-guava от модуля B, будет рассмотрена зависимость проекта от google-guava.

, если три вышеуказанных способа не будут работатьВаша проблема, я надеюсь, что вы можете выполнить mvn dependency:list и какие зависимости вы получите, когда запускаете тестовый пример, особенно внимание к версии google-guava, проверьте его версиюпросто правильно определить в pom.xml

проекта
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...