2012-03-04 34 views
6

Tôi đang làm việc trên một dự án Java sử dụng Maven để xây dựng nó. Các bit chức năng tôi đang phát triển sẽ khá cồng kềnh trong Java, nhưng đơn giản trong Clojure, vì vậy tôi muốn thực hiện nó trong Clojure và có Java sử dụng các lớp kết quả được tạo ra liền mạch.Sự cố khi thêm dự án Clojure vào Java

Dưới đây là các bài kiểm tra đơn vị tôi cần phải vượt qua (src/kiểm tra/java/com/foo/thời tiết/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; 
    } 
} 

Và đây là mã Clojure (src/main/clojure/com/foo/thời tiết/dữ liệu 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. [])) 

tôi đã thêm phần sau đây để pom.xml của tôi để xây dựng mã 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> 

Tuy nhiên, khi cố gắng chạy thử nghiệm đơn vị của tôi, trình biên dịch phàn nàn "không thể tìm thấy biến biểu tượng DataProcessor", vì vậy có vẻ như mã Clojure của tôi không được biên dịch đúng cách.

Một điều mà tôi đã nhận thấy là thư mục src/main/clojure của tôi dường như không được coi là thư mục nguồn trong IDE (IntelliJ) của tôi. Tôi nhấn chuột phải vào src/main/clojure trong khung nhìn project và chọn "Mark directory as> Source root", nhưng sau khi nhập lại phụ thuộc Maven (tức là "Update dependencies" trong Eclipse), thư mục không còn được đánh dấu là root nguồn .

Điều này khiến tôi tin rằng sự cố của tôi nằm trong cấu hình Maven của tôi.

Có ai giúp được không?

+0

Một tùy chọn khác cho các dự án Java + Clojure sử dụng Maven là [Zi] (https://github.com/pallet/zi) – noahlz

Trả lời

2

tôi sử dụng sau trong pom.xml của tôi mà dường như làm việc:

 <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> 

Ngoài ra, tôi đã phát hiện ra rằng Clojure hoạt động tốt nếu bạn bao gồm các tập tin nguồn Clojure trong một thư mục tài nguyên (bạn sẽ rõ ràng là cần phải tải chúng từ mã Java tất nhiên).

Bạn cũng có thể tìm thấy câu hỏi này hữu ích: Calling clojure from java

+0

này dường như không làm việc cho tôi; kiểm tra JUnit của tôi vẫn không thấy lớp do Clojure tạo ra. Các [Gọi clojure từ java] (http://stackoverflow.com/questions/2181774/calling-clojure-from-java) là trong thực tế, điểm khởi đầu của tôi để tìm ra cách để làm điều này. :) –

Các vấn đề liên quan