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

在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/.ivy

在向用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 not found”编译时出现此导入错误:

import nl.rhinofly.play_s3._
然而,这是可行的:

import fly.play.s3._

我的问题是:只考虑到缓存中的依赖项和材质,如何确定正确的导入路径是“fly.play.s3.?”?在哪里可以找到这些数据;DR:您无法从依赖项组和名称确定导入路径-两者不相关。两者之间的任何关联都是命名jar的约定的结果,但它没有以任何方式强制执行,也不总是被遵守,当然也不能被假定

详细信息

  • 首先,这种行为与Play无关,甚至不是Scala特有的,它继承了Java类名的工作方式和maven存储库命名jar依赖项的方式
  • “导入路径”实际上是“完全限定”类名,它只是类的名称,前面是jar中包含它的文件夹(类路径中的任何jar),以点分隔。jar名称与此无关
  • 任何jar都可以包含任何类,两个不同的jar可以包含具有相同完全限定名的两个类的实例(这不是理想的情况)
  • 您可以在任何现代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
    文件(尽管其中一些类可能是私有的或受包保护的;只能使用公共类)。

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

    详细信息

  • 首先,这种行为与Play无关,甚至不是Scala特有的,它继承了Java类名的工作方式和maven存储库命名jar依赖项的方式
  • “导入路径”实际上是“完全限定”类名,它只是类的名称,前面是jar中包含它的文件夹(类路径中的任何jar),以点分隔。jar名称与此无关
  • 任何jar都可以包含任何类,两个不同的jar可以包含具有相同完全限定名的两个类的实例(这不是理想的情况)
  • 您可以在任何现代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
    文件(尽管其中一些类可能是私有的或受包保护的;只有公共类可以使用)。

    jar tf正是我想要的!jar tf正是我所追求的!