【问题标题】:Why can't I seem to exclude this transitive dependency from build.sbt? (Continues to show up in ivyReport)为什么我似乎不能从 build.sbt 中排除这种传递依赖? (继续出现在 ivyReport 中)
【发布时间】:2019-11-02 10:20:01
【问题描述】:

我正在处理一个可以编译但在加载时抛出异常的项目:

[error] (run-main-5) java.util.ServiceConfigurationError: com.fasterxml.jackson.databind.Module: com.spotify.ffwd.http.fasterxml.jackson.datatype.jdk8.Jdk8Module not a subtype
[error] java.util.ServiceConfigurationError: com.fasterxml.jackson.databind.Module: com.spotify.ffwd.http.fasterxml.jackson.datatype.jdk8.Jdk8Module not a subtype
[error]     at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:590)
[error]     at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1237)
[error]     at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator$1.run(ServiceLoader.java:1268)
[error]     at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator$1.run(ServiceLoader.java:1267)
[error]     at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
[error]     at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1270)
[error]     at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
[error]     at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
[error]     at com.fasterxml.jackson.databind.ObjectMapper.findModules(ObjectMapper.java:994)
[error]     at org.apache.beam.sdk.options.PipelineOptionsFactory.<clinit>(PipelineOptionsFactory.java:468)
[error]     at com.spotify.scio.ScioContext$.defaultOptions(ScioContext.scala:293)
[error]     at com.spotify.scio.ScioContext$.apply(ScioContext.scala:216)
[error]     at com.mycompany.data.adaccountpipeline.endpoints.ExportUsersJob$.main(ExportUsersJob.scala:25)
[error]     at com.mycompany.data.adaccountpipeline.endpoints.ExportUsersJob.main(ExportUsersJob.scala)
[error]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]     at java.base/java.lang.reflect.Method.invoke(Method.java:567)

https://github.com/spotify/ffwd/issues/75 已经报告了确切的问题:

ffwd-http-client 的 Jar 文件在 META-INF/services 中包含不正确的记录。 [...] 这会破坏 java 服务发现。例如,在类路径上有 ffwd-http-client 并执行 new ObjectMapper().findAndRegisterModules() 会导致此错误:

由于作者尚未发布修复程序,我正在尝试解决它。​​

  1. 尝试完全删除传递依赖项ffwd-http-client 似乎是正确的方法?

  2. 如果传递依赖已成功删除,它是否应该停止出现在ivyReport 中?或者我该如何检查?


我尝试过的事情...

在我的build.sbt 中,我尝试通过多种方式删除依赖项...

libraryDependencies ++= Seq(
  "org.slf4j" % "slf4j-simple" % slf4jVersion,
  "com.mycompany.ads" % "ad-account-service-client" % adAccountServiceClientVersion,
  "com.mycompany.ads" % "ad-account-service" % adAccountServiceClientVersion,
  "com.mycompany.ads" % "adserver-data-pipelines" % adServerPipelineVersion,
  "com.mycompany.ads" % "adstudio-common-server" % adStudioCommonVersion,
  "com.mycompany" % "padlock-service-api" % padlockApiVersion,
  "org.scala-lang.modules" % "scala-java8-compat_2.11" % scalaJavaCompatVersion,
  "com.spotify.ffwd" % "ffwd-http-client" % "0.4.0" intransitive()
)
  .map(_.exclude("com.spotify.ffwd", "ffwd-http-client"))
  .map(_.exclude("com.spotify.ffwd", "*")),

但如果我这样做 ivyReportshow ivyReport 我仍然看到

    <module organisation="com.spotify.ffwd" name="ffwd-http-client">
        <revision name="0.4.0" status="release" pubdate="20171219102239" resolver="sbt-chain" artresolver="sbt-chain" homepage="https://github.com/spotify/ffwd" downloaded="false" searched="false" default="false" conf="compile, runtime(*), master(compile), runtime, compile(*), master" position="106">
            <license name="The Apache Software License, Version 2.0" url="http://www.apache.org/licenses/LICENSE-2.0.txt"/>
            <metadata-artifact status="no" details="" size="3463" time="0" location="/Users/acheong/.ivy2/cache/com.spotify.ffwd/ffwd-http-client/ivy-0.4.0.xml" searched="false" origin-is-local="false" origin-location="https://artifactory.spotify.net/artifactory/repo/com/spotify/ffwd/ffwd-http-client/0.4.0/ffwd-http-client-0.4.0.pom"/>
            <caller organisation="com.spotify.metrics" name="semantic-metrics-ffwd-http-reporter" conf="compile, runtime" rev="0.4.0" rev-constraint-default="0.4.0" rev-constraint-dynamic="0.4.0" callerrev="1.0.2"/>
            <artifacts>
                <artifact name="ffwd-http-client" type="jar" ext="jar" status="no" details="" size="6270059" time="0" location="/Users/acheong/.ivy2/cache/com.spotify.ffwd/ffwd-http-client/jars/ffwd-http-client-0.4.0.jar">
                    <origin-location is-local="false" location="https://artifactory.spotify.net/artifactory/repo/com/spotify/ffwd/ffwd-http-client/0.4.0/ffwd-http-client-0.4.0.jar"/>
                </artifact>
            </artifacts>
        </revision>
    </module>

所以我不是排除依赖吗?还是我没有正确检查依赖关系?

我也尝试过https://github.com/jrudolph/sbt-dependency-graph,但即使在我为 SBT 插件增加内存之后,IntelliJ 也会耗尽内存。

【问题讨论】:

    标签: java scala intellij-idea dependencies sbt


    【解决方案1】:

    我犯了一个业余错误。并不是我所有的尝试都真正有效,因为我不知道:

    你必须运行reload命令重新读取build.sbt!

    或者,重新启动 sbt,我有时但并非总是这样做,因此我的尝试不一致。

    来自 C++/Makefiles 和 Java/Maven 并且只在 Scala/SBT 中进行了一些小改动,我希望 SBT 能够“知道”是否有任何文件使用比上次构建更新的时间戳被触及,并且相应地刷新。我没有意识到sbt 交互式 shell 本质上使用 build.sbt 作为其静态配置。

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 2018-11-29
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多