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