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

  • 本文关键字:导入 路径 依赖 Scala scala
  • 更新时间 :
  • 英文 :


在向用 Scala 编写的 Play 2.2 应用程序添加依赖项时,我突然想到我不知道导入路径实际上是如何定义的,也不知道在哪里可以找到它。

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

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

看到这一点,我会假设导入将是"nl.rhinofly.play_s3";当我查看我的缓存时,这似乎证实了这种想法:

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

但是,使用"找不到 nl"进行编译时会出现此导入错误:

import nl.rhinofly.play_s3._

但是,这有效:

import fly.play.s3._

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

TL;DR无法从依赖项组和名称确定导入路径 - 两者不相关。两者之间的任何相关性都是命名 Jars 的约定的结果,但它没有以任何方式强制执行,并不总是得到遵守,当然也不能假设。

详情

  1. 首先,这种行为与Play无关,甚至不是Scala特有的,它继承自Java类名的工作方式和maven存储库命名jar依赖项的方式
  2. 。 ">
  3. 导入路径"实际上是">完全限定"的类名,它只是类的名称,前面是包含它的文件夹,这些文件夹在 jar 中(类路径中的任何 jar)用点分隔。jar 名称与此无关
  4. 任何 jar
  5. 都可以包含任何类,两个不同的 jar 可以包含具有相同完全限定名称的两个类的实例(不是理想的情况)

您可以做的是检查给定jar的内容,无论是在任何现代IDE(例如IntelliJ,Eclipse)中还是使用命令行jar tf,例如:

$ 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文件(尽管其中一些类可能是私有的或受包保护的;只能使用公共的)。

最新更新