我正在开发一个使用Maven构建它的Java项目。我正在开发的一些功能在Java中非常麻烦,但在Clojure中很简单,所以我想在Clojure中实现它并让Java无缝地使用生成的结果类。
这是我需要传递的单元测试(src / test / java / com / foo / weather / DataProcessorTest.java):
package com.foo.weather;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.*;
public class DataProcessorCljTest {
@Test
public void processWithTotalsAndSubTotals() throws Exception {
assertEquals(2, DataProcessor.process(createRawData()).size());
}
private List<List<String>> createRawData() {
List<List<String>> data = new ArrayList<List<String>>();
data.add(new ArrayList<String>(Arrays.asList("2011-11-01", "Temperature", "19.2")));
data.add(new ArrayList<String>(Arrays.asList("2011-11-01", "Pressure", "1.1")));
return data;
}
}
这是Clojure代码(src / main / clojure / com / foo / weather / data-processor.clj):
(ns com.foo.weather.DataProcessor
(:gen-class
:methods [#^{:static true} [process [java.util.List] java.util.List]]))
(defn process [raw-data]
(java.util.ArrayList. []))
我已将以下内容添加到我的pom.xml中以构建Clojure代码:
<project>
<!-- lots of stuff omitted -->
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>com.theoryinpractise</groupId>
<artifactId>clojure-maven-plugin</artifactId>
<version>1.3.6</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<!-- ... -->
<repository>
<id>clojure-releases</id>
<url>http://build.clojure.org/releases</url>
</repository>
</repositories>
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
</project>
然而,当尝试运行我的单元测试时,编译器抱怨“找不到符号变量DataProcessor”,所以看起来我的Clojure代码没有被正确编译。
我注意到的一件事是我的src / main / clojure目录似乎不像我的IDE(IntelliJ)中的源目录。我在项目视图中右键单击src / main / clojure并选择“将目录标记为&gt;源根”,但在重新导入Maven依赖项(即Eclipse中的“Update dependencies”)后,该目录不再标记为源根
这让我相信我的问题出现在我的Maven配置中。
有人可以帮忙吗?
答案 0 :(得分:2)
我在我的pom.xml中使用以下内容似乎有效:
<plugin>
<groupId>com.theoryinpractise</groupId>
<artifactId>clojure-maven-plugin</artifactId>
<version>1.3.8</version>
<executions>
<!-- ... -->
<execution>
<id>test-clojure</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
<configuration>
<sourceDirectories>
<sourceDirectory>src/main/clojure</sourceDirectory>
</sourceDirectories>
<testSourceDirectories>
<testSourceDirectory>src/test/clojure</testSourceDirectory>
</testSourceDirectories>
</configuration>
</plugin>
此外,我发现如果将Clojure源文件包含在资源目录中,Clojure可以正常工作(当然,您显然需要从Java代码加载它们)。
您可能还会发现此问题有用:Calling clojure from java