【问题标题】:How can I tell a Cursive Clojure module to depend on a local Java/Scala module?如何告诉 Cursive Clojure 模块依赖于本地 Java/Scala 模块?
【发布时间】:2016-05-09 10:37:19
【问题描述】:

我将一个 Leiningen 项目导入 Intellij,与一些现有的 Java 和 Scala 模块并排放置。我想从我的 Clojure 模块中调用这些模块中的函数,但我不确定如何定义这种依赖关系。我去了项目设置-> 模块和通常缺少的“依赖项”选项卡,这让我相信除了 Leiningen 项目文件之外,我不允许在任何地方表达依赖项(我玩过 Leiningen 项目编辑器并且无法弄清楚如何在那里执行此操作...)。

如果有人好奇 Intellij 是如何查看这个模块的,这里是 .iml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<module cursive.leiningen.project.LeiningenProjectsManager.displayName="testproject:0.1.0-SNAPSHOT" cursive.leiningen.project.LeiningenProjectsManager.isLeinModule="true" type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
  <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
  <sourceFolder url="file://$MODULE_DIR$/dev-resources" isTestSource="false" />
  <sourceFolder url="file://$MODULE_DIR$/resources" isTestSource="false" />
  <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
  <excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Leiningen: clojure-complete:0.2.3" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/clojure:1.6.0" level="project" />
<orderEntry type="library" name="Leiningen: org.clojure/tools.nrepl:0.2.10" level="project" />

【问题讨论】:

  • Java 和 Scala 模块是如何构建的?它们是否安装在您本地的 Maven 存储库中?
  • 我在我的 clj 模块上看到一个“依赖项”选项卡
  • @PeakCode 不,它们是使用 sbt 构建的,但我真的不想发布工件(我在一些论坛上看到人们建议使用本地 Maven 存储库,正如您可能建议的那样)。我在问是否有一种方法可以完全通过 IDE 强制依赖,这样我就可以在不配置额外发布设置的情况下立即重新构建/解决(IntelliJ 通过 IDE 构建这些 Scala 项目没有问题,我可以从其他依赖它们Scala/Java 模块没有问题)。
  • 我打开了一个 gradle 项目,然后将 lein 项目添加为一个新模块(文件 -> 新建 -> 来自现有源的模块)
  • 我将其作为 lein 项目打开

标签: java intellij-idea clojure cursive


【解决方案1】:

我开发草书。我怀疑现在可能没有一个好的解决方案。我将查看代码,看看是否能找到一种方法,但它需要了解 Maven、Gradle 或 SBT(在您的情况下)如何在内部表示模块。今天我会试着看看这个,让你知道。我实际上不知道在 IntelliJ 中是否可以让 Maven 项目依赖于 SBT 项目或 Gradle 项目。

与此同时,发布到本地存储库是我能想到的唯一解决方法。抱歉,我知道它很笨重。

从 IntelliJ 的角度来看,“普通”项目和 IntelliJ 项目没有区别,只是 Cursive 会在每次同步时重写很多模块配置,因为理论上配置应该由 Leiningen 管理。这或多或少是 Maven 集成的工作方式。

【讨论】:

  • 谢谢科林,让我知道! @dAni 似乎认为这是开箱即用的,所以我会尝试,尽管我仍然持怀疑态度。我还发现这个问题似乎指向构建本地 jar 的解决方案,并取决于通过 project.clj 的路径(还没有时间完全通读它..)——stackoverflow.com/questions/2404426/…
【解决方案2】:

所以,我最终能够做到这一点......正如 dAni 建议的那样,我能够创建一个新的 Clojure 项目(这次通过 IntelliJ -- 之前我做了“lein new clj-test”然后尝试导入这个进入 IntelliJ),创建一个 Leiningen 构建文件,处理该构建文件,然后在项目结构中查看模块的依赖项选项卡。

不过,REPL 还是找不到这些类。所以我必须编辑运行配置以在“普通 JVM 进程”中使用 nREPL,这让我可以选择我可能会使用其类路径的模块。

讨厌成为接受我自己答案的人(特别是因为这有一些限制......我想最终将它与 Gorilla REPL 一起使用,因此可能会为此制定不同的策略)但我认为这回答了原始问题很好,希望对某人有所帮助。我认为上述策略本质上是使用 Leiningen 进行依赖解析,但实际上并非用于 REPL,因此 Leiningen 的依赖项在类路径上可用,但 REPL 是通过 IntelliJ 以其他方式启动的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2019-02-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多