在Scala中,如何根据依赖项名称确定导入路径?

时间:2018-01-24 21:02:34

标签: scala

在向用Scala编写的Play 2.2应用程序添加依赖项时,我发现我不知道导入路径是如何实际定义的,或者在哪里找到它。

例如,我将此依赖项添加到我的Build.scala文件中,如下所示:

val appDependencies = Seq(
  "nl.rhinofly" %% "play-s3" % "4.0.0",
  ...
)

考虑到这一点,我认为导入将是' nl.rhinofly.play_s3&#39 ;;当我查看我的缓存时,这似乎证实了这一点:

/home/immauser/.ivy2/cache/nl.rhinofly/play-s3_2.10

但是,使用' nl编译时导入错误':

import nl.rhinofly.play_s3._

然而,这有效:

import fly.play.s3._

我的问题是:只考虑缓存中的依赖关系和材料,如何确定正确的导入路径是" fly.play.s3 ._"?人们在哪里找到这些数据?

1 个答案:

答案 0 :(得分:4)

TL; DR :您无法确定依赖关系组和名称的导入路径 - 两者无关。两者之间的任何相关性都是用于命名Jars的约定的结果,但它不以任何方式强制执行,并不总是遵守,当然也不能假设。< / p>

<强>详情:

  1. 首先,这种行为与Play无关,甚至不是Scala特有的,它继承自Java类名称的工作方式以及maven存储库命名jar依赖项的方式
  2. &#34;导入路径&#34; 实际上是&#34;完全合格的&#34;类名,它只是类的名称,前面是包含它的文件夹在jar (类路径中的任何一个jar)中用点分隔。 jar名称与此
  3. 无关
  4. 任何jar都可以包含任何类,两个不同的jar可以包含具有相同完全限定名称的两个类的实例(不是理想的情况)
  5. 可以做的是在任何现代IDE(例如IntelliJ,Eclipse)或使用命令行jar tf内检查给定jar的内容,例如:

    $ jar tf ~/.ivy2/cache/org.mockito/mockito-core/jars/mockito-core-1.9.5.jar
    

    结果将是jar中所有文件的列表,例如:

    ...
    org/mockito/Answers.class
    org/mockito/Answers.java
    org/mockito/ArgumentCaptor.class
    org/mockito/ArgumentCaptor.java
    org/mockito/ArgumentMatcher.class
    org/mockito/ArgumentMatcher.java
    ...
    

    *.class文件在技术上可以导入(尽管其中一些类可能是私有的或受包保护的;只能使用公共类)。