Использование Apache Directory API в приложении Spark - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь использовать org.apache.directory.api для создания подключения к службе LDAP и запрашивать ее как часть приложения Spark. Код Scala для подключения и запроса LDAP работает должным образом, когда я использую его как часть приложения Java, но при выполнении как часть приложения Spark он выдает сообщение об ошибке, подобное этому:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.directory.api.util.Strings.toLowerCaseAscii(Ljava/lang/String;)Ljava/lang/String;
        at org.apache.directory.api.ldap.codec.api.DefaultConfigurableBinaryAttributeDetector.addBinaryAttribute(DefaultConfigurableBinaryAttributeDetector.java:166)
        at org.apache.directory.api.ldap.codec.api.DefaultConfigurableBinaryAttributeDetector.setBinaryAttributes(DefaultConfigurableBinaryAttributeDetector.java:206)
        at org.apache.directory.api.ldap.codec.api.DefaultConfigurableBinaryAttributeDetector.<init>(DefaultConfigurableBinaryAttributeDetector.java:133)
        at org.apache.directory.ldap.client.api.LdapNetworkConnection.buildConfig(LdapNetworkConnection.java:599)
        at org.apache.directory.ldap.client.api.LdapNetworkConnection.<init>(LdapNetworkConnection.java:410)

Исключение возникает в самый первый раз, когда я пытаюсь создать сетевое соединение:

val ldapConnection = new LdapNetworkConnection(endpoint, port, true)

В дереве зависимостей я вижу, что api-util также является частью зависимости Spark, но в дерево помечено как опущенное из-за конфликта с моей версией - однако, поскольку эта банка предоставляется, я не уверен, загружается ли она первой, и поэтому моя зависимость игнорируется:

[INFO] +- org.apache.spark:spark-core_2.11:jar:2.3.0.cloudera2:provided
[INFO] |  +- org.apache.hadoop:hadoop-client:jar:2.6.0-cdh5.13.3:provided
[INFO] |  |  +- org.apache.hadoop:hadoop-common:jar:2.6.0-cdh5.13.3:provided
[INFO] |  |  |  +- org.apache.hadoop:hadoop-auth:jar:2.6.0-cdh5.13.3:provided
[INFO] |  |  |  |  +- org.apache.directory.server:apacheds-kerberos-codec:jar:2.0.0-M15:provided
[INFO] |  |  |  |  |  +- (org.apache.directory.api:api-util:jar:1.0.0-M20:provided - omitted for conflict with 1.0.3)

Я не могу узнайте, почему этот вызов завершился бы методом, которого не существует, или в чем может быть ошибка. Любое предложение, как решить или отладить это?

1 Ответ

1 голос
/ 06 мая 2020

Я нашел решение, это произошло из-за зависимости Spark от пакета LDAP, имеющего другую версию. Я решил это, закрасив необходимые Apache пакеты, вот так:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <shadedClassifierName>${jarNameWithDependencies}</shadedClassifierName>
        <artifactSet>
            <includes>
                <include>*:*</include>
            </includes>
        </artifactSet>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <relocations>
                    <relocation>
                        <pattern>org.apache.directory</pattern>
                        <shadedPattern>org.apache.shaded.directory</shadedPattern>
                    </relocation>
                    <relocation>
                        <pattern>org.apache.mina</pattern>
                        <shadedPattern>org.apache.shaded.mina</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
        </execution>
    </executions>
</plugin>
...