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

时间:2012-05-06 17:59:46

标签: scala sbt ivy scala-ide ivyde

我正在使用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将源代码和Javadocs下载到Ivy存储库,但即使我在从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的新手,所以这并没有告诉我太多。我只是觉得它提到了源代码和javadocs,但不知怎的,IvyDE并没有提起它。

5 个答案:

答案 0 :(得分:35)

你可以把

EclipseKeys.withSource := true

到你的build.sbt,它允许sbteclipse下载所有源代码并使它们在Eclipse中可访问。请注意,这将从所有已配置的依赖项下载所有源。我不知道如何告诉sbt只下载单个依赖项的源代码。

答案 1 :(得分:9)

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

添加build.sbt:

EclipseKeys.withSource := true

然后运行:

rm -rf  ~/.ivy2/cache/

sbt update-classifiers

sbt eclipse

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

答案 2 :(得分:3)

我设法最终使这个工作。

我不得不使用外部常春藤设置文件:

<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但没有来源,它将不会检查其他解析器的sources / javadoc。本地Play安装中的存储库没有源或javadoc。

当IvyDE在Eclipse中解析时,这会为我的依赖项中的大多数jar提供源代码附件。

答案 3 :(得分:2)

我发现给IvyDE和sbt不同的常春藤缓存目录更容易。是的,它需要更多空间,但默认情况下sbt不下载源。一旦sbt加载了没有源代码的缓存,IvyDE就不会添加它们。您可以告诉sbt获取它们,但对我来说,使用更多磁盘空间并使用两个不同的缓存更容易。

我这样做是将sbt保留为默认值,并将IvyDE设置为在Preferences&gt;中使用此文件。常春藤&gt; “设置”标签&gt;常春藤设置文件:

<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服务器,因此您需要根据您的环境对其进行修改。

答案 4 :(得分:1)

好吧,我放弃了这个并返回NetBeans 7.1.2 + Scala插件+ Maven。这种组合更好地集成,开箱即用而不需要修补。