【问题标题】:How can I compile a multi-module maven project, where a module have both clojure and java code如何编译一个多模块 maven 项目,其中一个模块同时具有 clojure 和 java 代码
【发布时间】:2016-06-21 21:57:21
【问题描述】:

我有一个多模块 maven 项目,其中一个模块同时具有 java 和 clojure 代码,clojure 代码需要来自 java 源的 pojo,而 java 源中的另一个类需要 clojure 编译代码(我添加了:gen-类和项目编译得很好,即使它最初给出了一个错误,因为当 clojure-maven-plugin 和 compiles 执行 clojure:compile and compile 时看不到 java 类 I)。但这不适用于管理多模块的外部 pom。感谢您在寻找解决方案方面的任何帮助

【问题讨论】:

  • 基本上你应该避免Java代码和Clojure代码之间的相互依赖。目前 clojure-maven-plugin 无法在 java world 和 clojure world 之间交替编译过程。
  • 这似乎是一个很常见的场景,本来我以为会有很多解决方案:)

标签: maven clojure maven-plugin clojure-java-interop


【解决方案1】:

正如其中一位 cmets 所说,clojure-maven-plugin 无法处理同一模块中 Java 和 Clojure 代码之间的循环依赖关系。 Java 代码在 Clojure 代码之前编译。

但您可以重构代码以消除循环依赖。将Java+Clojure项目(maven模块)一分为三:

  • 基础 Java 模块
  • Clojure 模块
  • 第二个 Java 模块

Base Java 模块至少包含 Clojure 模块需要的 POJO 以及可能的其他常见内容。 Clojure 模块将包含所有 Clojure 代码,而第二个 Java 模块将包含需要由 Clojure 编译器生成的类的 Java 代码部分。只有 Clojure 模块需要 clojure-maven-plugin。

然后您可以设置这些模块之间的依赖关系,例如:

  • Clojure 模块依赖于 Base Java 工件
  • 第二个 Java 模块依赖于 Base Java 和 Clojure 工件

只要在 Clojure 模块中正确设置了 AOT 编译,现在应该可以编译所有内容。我相信 clojure-maven-plugin AOT 默认编译所有命名空间。没有 AOT 编译,(gen-class) 什么都不做。

【讨论】:

  • 是的,这似乎是最好的解决方法,可能是暂时的答案
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多