如何在Scala IDE中将源码附加到SBT管理的依赖项?

28

我正在使用Scala IDE 2.0.1和SBT 0.11.2开始学习Akka 2.0.1。我的build.sbt文件看起来像这样:

name := "akka"

version := "0.1"

scalaVersion := "2.9.2"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "com.typesafe.akka" % "akka-actor" % "2.0.1"

如您所见,没有什么特别之处。

现在我该如何告诉Eclipse使用带有akka-actor库源分类器的构件?

在SBT中,我可以使用update-classifiers命令从Ivy存储库下载源代码和Javadocs,但即使我在运行sbteclipse插件的eclipse命令之前这样做,Eclipse仍然不知道源代码的存在。当然,我可以手动完成此操作,但对于更多的库来说,这并不可扩展。

我也尝试过使用IvyDE插件和deliver-local命令。虽然它可以集成依赖管理,但似乎无法解决源代码问题。

有什么线索吗?

编辑: 这是deliver-local生成的ivy.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<info organisation="default" module="akka_2.9.2" revision="0.1" status="release" publication="20120506225613">
    <description>
    akka
    </description>
</info>
<configurations>
    <conf name="compile" visibility="public" description=""/>
    <conf name="runtime" visibility="public" description="" extends="compile"/>
    <conf name="test" visibility="public" description="" extends="runtime"/>
    <conf name="provided" visibility="public" description=""/>
    <conf name="optional" visibility="public" description=""/>
    <conf name="sources" visibility="public" description=""/>
    <conf name="docs" visibility="public" description=""/>
    <conf name="pom" visibility="public" description=""/>
</configurations>
<publications>
    <artifact name="akka_2.9.2" type="pom" ext="pom" conf="pom"/>
    <artifact name="akka_2.9.2" type="jar" ext="jar" conf="compile"/>
    <artifact name="akka_2.9.2" type="src" ext="jar" conf="sources" e:classifier="sources"/>
    <artifact name="akka_2.9.2" type="doc" ext="jar" conf="docs" e:classifier="javadoc"/>
</publications>
<dependencies>
    <dependency org="org.scala-lang" name="scala-library" rev="2.9.2" conf="compile->default(compile)"/>
    <dependency org="com.typesafe.akka" name="akka-actor" rev="2.0.1" conf="compile->default(compile)"/>
    <exclude org="org.scala-lang" module="scala-library" artifact="*" type="jar" ext="*" matcher="exact"/>
    <exclude org="org.scala-lang" module="scala-compiler" artifact="*" type="jar" ext="*" matcher="exact"/>
    <override org="org.scala-lang" module="scala-library" matcher="exact" rev="2.9.2"/>
    <override org="org.scala-lang" module="scala-compiler" matcher="exact" rev="2.9.2"/>
</dependencies>
</ivy-module>

我对Ivy不熟悉,所以这并没有给我提供太多信息。我只是觉得它提到了源码和javadoc,但是一些IvyDE并没有将其拾取。


你能附上你的ivyde设置的截图吗? - oers
我在安装插件后只是使用了默认设置。我还尝试勾选“自动映射具有唯一源工件的jar工件”和“自动映射具有唯一javadoc工件的jar工件”,但没有成功 - 即使关闭并重新打开项目也是如此。 - Christian Schlichtherle
项目的ivde类路径容器是否已经勾选了所有重要的配置? - oers
在您的项目设置中,单击IvyDE ClassPath容器和“编辑”(http://stackoverflow.com/questions/9979520/how-ivyde-can-coexist-with-command-line-ant-and-ivy/9988175#9988175)。从您的ivy.xml文件中,您应该至少检查编译和源代码。 - oers
谢谢,但那也没什么帮助。我已经放弃了这个,转向了NetBeans/Maven/Scala工具链。 - Christian Schlichtherle
在由deliver-local生成的ivy.xml中,我需要将<dependencies>行更改为<dependencies defaultconfmapping="*->default,sources">。这样就可以获取源代码了。 - James Moore
5个回答

35

你可以放置

EclipseKeys.withSource := true

将以下内容添加到你的build.sbt,这样sbteclipse可以下载所有源代码并使其在Eclipse中可访问。请注意,这将从所有配置的依赖项中下载所有源代码。我不知道如何告诉sbt仅下载单个依赖项的源代码。


5
由于我进行了一些研究和试错才使它正常工作,因此这里是需要做的事情:在Build.sbt中添加导入import com.typesafe.sbteclipse.plugin.EclipsePlugin._。在调用play.Project.setting(...)中添加EclipseKeys.withSource := true。执行play update,然后执行play eclipse。切换到Eclipse,选择项目并按F5键。 - notan3xit
1
@notan3xit:我认为你指的是Build.scala而不是Build.sbt,因为对于.sbt文件,你不需要这些导入... - kiritsuku
有人知道为什么这个操作没有将scaladoc附加到SCALA_CONTAINER中的scala-library.jar吗?源jar包在那里,但是scaladoc/javadoc却没有。 - metasim
4
使用eclipse with-source=true命令同样有效。如果某些依赖项未被下载,可能是因为您曾经在没有正确解析器的情况下请求它们。从~/.ivy/目录中删除这些exclude_classifiers缓存文件可以帮助我解决这个问题。 - EECOLOR
使用此插件非常简单:https://github.com/typesafehub/sbteclipse。安装插件,然后在build.sbt中添加“EclipseKeys.withSource:= true”即可。 - sebastian

9

最后我找到了一个解决方案,让sbt下载源代码并告诉Eclipse如何找到它们。

在build.sbt中添加:

EclipseKeys.withSource := true

然后运行:

rm -rf  ~/.ivy2/cache/

sbt update-classifiers

sbt eclipse

奇怪的是,如果您已经在ivy中下载了依赖项,则它们已经在缓存中,您将无法为它们下载源代码。


3

最终我成功了。

我不得不使用一个外部的ivy设置文件:

<ivysettings>
  <properties environment="env" />
  <settings defaultResolver="play" defaultResolveMode="dynamic" />
  <caches defaultCacheDir="${env.PLAY_HOME}/repository/cache" />
  <resolvers>
    <chain name="play">
      <ibiblio name="typesafe-releases" m2compatible="true" root="http://repo.typesafe.com/typesafe/releases" />
      <ibiblio name="sonatype-oss-releases" m2compatible="true" root="http://oss.sonatype.org/content/repositories/releases" />
      <filesystem name="local-filesystem">
        <ivy pattern="${env.PLAY_HOME}/repository/local/[organization]/[module]/[revision]/ivys/ivy.xml" />
        <artifact pattern="${env.PLAY_HOME}/repository/local/[organization]/[module]/[revision]/[type]s/[module](-[classifier]).[ext]" />
      </filesystem>
      <ibiblio name="central-uk" m2compatible="true" root="http://uk.maven.org/maven2" />
      <ibiblio name="typesafe-snapshots" m2compatible="true" root="http://repo.typesafe.com/typesafe/snapshots" />
      <ibiblio name="sonatype-oss-snapshots" m2compatible="true" root="http://oss.sonatype.org/content/repositories/snapshots" />
    </chain>
  </resolvers>
</ivysettings>

并添加:

externalIvySettings(baseDirectory(_ / "ivysettings.xml"))

添加到我的Build.scala文件中。

仓库链中解析器的顺序很重要,因为如果Ivy找到一个jar但没有源代码,它不会检查其他解析器以获取源代码/ javadoc。本地Play安装中的存储库没有源代码或javadoc。

当IvyDE在Eclipse中解析时,这将使我获得大多数依赖项中的源代码附件。


2
我发现将IvyDE和sbt的ivy缓存目录分开会更容易。是的,这需要更多的空间,但是默认情况下sbt不会下载源代码。一旦sbt加载了没有源代码的缓存,IvyDE就不会再添加它们。你可以告诉sbt去获取它们,但对我来说,更容易的方法是使用更多的磁盘空间并使用两个不同的缓存。
我通过保留sbt的默认设置,并在偏好设置中设置IvyDE使用以下文件:Preferences > Ivy > Settings tab > Ivy settings file。
<ivysettings>

    <settings defaultResolver="nexus" />

    <property
        name="nexus-public"
        value="http://localhost:8081/nexus/content/groups/public" />

    <resolvers>

        <ibiblio
            name="nexus"
            m2compatible="true"
            root="${nexus-public}" />
    </resolvers>

    <caches defaultCacheDir="${user.home}/.ivy2eclipse" />

</ivysettings>

这指向我的本地nexus服务器,因此您需要根据您的环境进行修改。


谢谢,但是正如我所说的,我已经放弃了sbt+Ivy,现在很愉快地使用Maven。 - Christian Schlichtherle

1

好吧,我已经放弃了这个,回到了NetBeans 7.1.2 + Scala插件+ Maven。这个组合更好地集成在一起,并且可以直接使用而无需调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接