Я создаю класс 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.
К вашему сведению:
- Я использую IntelliJ IDEA и maven 3.
- Класс A, определенный локально, и класс B в lib lib имеют абсолютно одинаковые имя класса, имя пакета, имена функций и параметры.
Я попробовал это, и это не сработало:
<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."