Maven: как удалить локальный переопределяющий класс и скомпилировать с исходным классом в зависимости, когда shade упаковывает проект в jar - PullRequest
0 голосов
/ 01 июля 2018

Я создаю класс A с тем же именем и пакетом, что и B в lib lib, чтобы переопределить B, когда я запускаю программу spark локально, чтобы помочь мне отладить программу.

Мне также нужно затенить пакет программы на jar с зависимостями для загрузки на сервер для запуска программы spark в кластере.

Проблема в том, что каждый раз, когда я затеняю пакет программы, мне нужно сначала удалить локально определенный класс A, в противном случае, когда я запускаю упакованный jar затенения в кластере, исключение приведет к сбою всего процесса:

User class threw exception: java.lang.NoSuchMethodError: A.fun1.

И в следующий раз, когда мне нужно отладить программу локально, мне нужно снова добавить класс А. Это немного раздражает.

Интересно, может ли Maven помочь мне удалить локальный переопределяющий класс A и скомпилировать с исходным классом B при формировании пакета проекта, в то же время позволяя мне запускать и отлаживать программу локально с локальным классом A, переопределяющим класс B в spark.

К вашему сведению:

  1. Я использую IntelliJ IDEA и maven 3.
  2. Класс A, определенный локально, и класс B в lib lib имеют абсолютно одинаковые имя класса, имя пакета, имена функций и параметры.
  3. Я попробовал это, и это не сработало:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <id>uber-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>${project.artifactId}-${project.version}-jar-with-dependencies</finalName>
                        <filters>
                            <filter>
                                <artifact>${project.groupId}:${project.artifactId}</artifact>
                                <excludes>
                                    <exclude>package-of-classA/classA.*</include>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    

    и отчеты:

"Исключительная ситуация класса пользователя: java.lang.NoSuchMethodError: A.fun1."

...