Spark 2.1 с Pureconfig 0.8 обходной путь для Maven

Приведенное ниже решение, взятое из Spark, не работающего с pureconfig, похоже, является рабочим решением для sbt, но ему трудно найти версию maven для этого. Попытка получить pureconfig 0.8, работающую с spark 2.1, используя spark-submit, но все равно получаю надоедливые Exception in thread "main" java.lang.NoSuchMethodError: shapeless.Witness$.mkWitness(Ljava/lang/Object;)Lshapeless/Witness; ошибка вне IntelliJ.

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("shapeless.**" -> "shadeshapless.@1")
    .inLibrary("com.chuusai" % "shapeless_2.11" % "2.3.2")
    .inLibrary("com.github.pureconfig" %% "pureconfig" % "0.7.0")
    .inProject
)

Здесь также попробовали предлагаемое решение Spark с Pureconfig - правильная конфигурация плагина maven shade, но все же не повезло.

Это последняя конфигурация, которая сработала, если я использую uber jar, который создается, но я не уверен, что полностью понимаю, как работает maven shading, и есть ли способ избежать создания дополнительного переименованного jar? В идеале я хочу просто использовать jar с зависимостями, которые создаются, а не создавать дополнительный третий jar с приведенным ниже:

   <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>3.0.0</version>
       <executions>
           <execution>
               <phase>package</phase>
               <goals>
                   <goal>shade</goal>
               </goals>
           </execution>
       </executions>
       <configuration>
           <createDependencyReducedPom>false</createDependencyReducedPom>
           <relocations>
               <relocation>
                   <pattern>shapeless</pattern>
                   <shadedPattern>com.shaded.shapeless</shadedPattern>
               </relocation>
           </relocations>
           <filters>
               <filter>
                   <artifact>*:*</artifact>
                   <excludes>
                       <exclude>META-INF/*.SF</exclude>
                       <exclude>META-INF/*.DSA</exclude>
                       <exclude>META-INF/*.RSA</exclude>
                   </excludes>
               </filter>
           </filters>
           <finalName>uber-${project.artifactId}-${project.version}</finalName>
       </configuration>
   </plugin>

1 ответ

Извините за ответ так поздно. Я действительно не уверен, что является причиной проблемы. Я изменил свою версию pureconfig на 0.8.0 (использовал 0.7.2) и все еще вроде работает.

Поскольку это не кажется легким, я постараюсь дать вам более полное представление о том, как устроен мой проект, возможно, это как-то поможет. Ох и кстати, я использую Maven 3.3.9 но я сомневаюсь, что это имеет значение (хотя кто знает).

Итак, мой проект состоит из подмодулей, то есть у меня есть пом верхнего уровня, где <modules></modules> указаны, и каждый модуль имеет свой собственный pom.

Теперь в pom верхнего уровня я использую управление зависимостями, а также управление плагинами, так что это выглядит так:

</dependencyManagement>
  <dependencies>
    <dependency>
        <!-- some dependency -->
    </dependency>
  </dependencies>
</dependencyManagement>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                    <relocations>
                        <relocation>
                            <pattern>shapeless</pattern>
                            <shadedPattern>com.matek.chuusai.shapeless</shadedPattern>
                        </relocation>
                    </relocations>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Теперь в подмодулях настройка зависимостей, а также добавление плагина maven shade выглядит следующим образом:

    <dependencies>
      <dependency>
          <!-- some dependency -->
      </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <groupId>org.apache.maven.plugins</groupId>
            </plugin>
        </plugins>
    </build>

Если в вашем проекте есть подмодули, попробуйте настроить его таким образом. Надеюсь, это поможет (как-то).

Другие вопросы по тегам