【问题标题】:How to attach sources to SBT managed dependencies in Scala IDE?如何在 Scala IDE 中将源附加到 SBT 托管依赖项?
【发布时间】:2012-05-15 09:58:12
【问题描述】:

我从 Akka 2.0.1 开始使用 Scala IDE 2.0.1 和 SBT 0.11.2。我的 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 没有选择它。

【问题讨论】:

  • 您能附上您的 ivyde 设置的屏幕截图吗?
  • 我只是在安装插件后使用默认设置。我还尝试勾选“具有唯一源工件的自动映射 jar 工件”和“具有唯一 javadoc 工件的自动映射 jar 工件”,但没有成功 - 即使在关闭并重新打开项目之后也是如此。
  • 并且该项目的 ivde 类路径容器已检查所有重要配置?
  • In your project settings click on the IvyDE ClassPath Container and "Edit"。从您的 ivy.xml 中,您应该已经编译,源代码检查(至少)。
  • 谢谢,但这也无济于事。我已经放弃了,转而使用 NetBeans/Maven/Scala 工具链。

标签: scala sbt ivy scala-ide ivyde


【解决方案1】:

你可以放

EclipseKeys.withSource := true

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

【讨论】:

  • 由于我花了一些研究和反复试验来完成这项工作,所以需要做的是:在Build.sbt 中,添加导入import com.typesafe.sbteclipse.plugin.EclipsePlugin._。在对play.Project.setting(...) 的呼叫中,添加EclipseKeys.withSource := true。执行play update,然后执行play eclipse。切换到 Eclipse,选择项目并按 F5。
  • @notan3xit:我认为您的意思是 Build.scala 而不是 Build.sbt,因为对于 .sbt 文件,您不需要这些导入...
  • 有人知道为什么这不会将 scaladoc 附加到 SCALA_CONTAINER 中的 scala-library.jar 吗?源 .jar 在那里,但不是 scaladoc/javadoc。
  • 使用eclipse with-source=true 命令也应该可以工作。如果某些依赖项没有下载,那可能是因为您曾经在没有适当的解析器的情况下请求它们。从~/.ivy/ 目录中删除exclude_classifiers 缓存文件对我有帮助。
  • 使用这个插件非常简单:github.com/typesafehub/sbteclipse。安装插件,然后在 build.sbt 中添加EclipseKeys.withSource := true
【解决方案2】:

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

在 build.sbt 中添加:

EclipseKeys.withSource := true

然后运行:

rm -rf  ~/.ivy2/cache/

sbt update-classifiers

sbt eclipse

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

【讨论】:

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

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

    【讨论】:

      【解决方案4】:

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

      我将 sbt 保留为默认值,并在 Preferences > Ivy > Settings 选项卡 > Ivy 设置文件中设置 IvyDE 以使用此文件:

      <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。
      【解决方案5】:

      好吧,我已经放弃了,回到了 NetBeans 7.1.2 + Scala 插件 + Maven。这种组合的集成度要好得多,而且开箱即用,无需修修补补​​。

      【讨论】:

        猜你喜欢
        • 2013-05-28
        • 2015-10-27
        • 1970-01-01
        • 2011-11-14
        • 2013-06-05
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 2019-04-11
        相关资源
        最近更新 更多