[입 개발] How to build cassandra with Eclipse

갑자기 Cassandra 소스코드가 보고 싶어져서, 빌드를 시도해봤습니다. Cassandra를 eclipse 에서 빌드하는 방법은 굉장히 쉽습니다. cassandra를 빌드하기 위해서는 ant 1.8.1 이상이 필요합니다. 저는 다음과 같이 git 을 통해서 cassandra를 받았습니다. 다음 명령을 통해서 Eclipse 에서 사용할 수 있습니다.

git clone http://git-wip-us.apache.org/repos/asf/cassandra.git cassandra-trunk
cd cassandra-trunk
ant build
ant generate-eclipse-files

해당 작업이 끝나면 다음과 같은 순서를 따릅니다.

  • File -> New -> Java Project 선택
  • Project 명을 cassandra-trunk 로 정하고 Use Default Location 을 해제한 다음 아까 전에 소스 코드를 받은 디렉토리를 지정합니다.
  • Next -> Finish 하시면 기본적으로 Cassandra 프로젝트가 완성됩니다.

이 후에 실제 실행을 할 수 있도록 Run Configuration 을 설정합니다.

  • Run -> Run Configuration 을 선택합니다.
  • Java Application 을 선택해서 New Configuration을 만듭니다.
  • Main 탭에서 Main Class 를 org.apache.cassandra.service.CassandraDaemon 를 설정합니다. 이것은 소스 코드를 해당 클래스에서 부터 살펴나가면 된다라는 것을 알려줍니다.
  • Arguments 탭에서 다음 값을 VM arguments로 설정합니다. 디렉토리 명을 자신의 위치에 맞추면 됩니다.

-Dcassandra.config=file:C:\projects\cassandra-trunk\conf\cassandra.yaml
-Dcassandra-foreground
-ea -Xmx1G
-Dlog4j.configuration=file:C:\projects\cassandra-trunk\conf\log4j-server.properties

이 이후에 cassandra.yaml 에서 /var/lib 라고 되어 있는 경로들을 모두 자신의 프로젝트 경로로 설정해줘야 합니다. 이제 cassandra 는 정상적으로 실행이 되는데, 경우에 따라서 cassandra-cli 가 동작하지 않는 경우가 있습니다.


C:\projects\cassandra-trunk\bin>.\cassandra-cli.bat
Starting Cassandra Client
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version Unknown

Exception in thread "main" org.yaml.snakeyaml.error.YAMLException: java.io.IOExc
eption: Stream closed
 at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:149)
 at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:116)
 at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:105)
 at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.ja
va:961)
 at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.ja
va:234)
 at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:18
0)
 at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produ
ce(ParserImpl.java:199)
 at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:162)
 at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:147)
 at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:103)

at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseCons
tructor.java:117)
 at org.yaml.snakeyaml.Loader.load(Loader.java:52)
 at org.yaml.snakeyaml.Yaml.load(Yaml.java:166)
 at org.apache.cassandra.cli.CliClient.loadHelp(CliClient.java:188)
 at org.apache.cassandra.cli.CliClient.getHelp(CliClient.java:173)
 at org.apache.cassandra.cli.CliClient.printBanner(CliClient.java:199)
 at org.apache.cassandra.cli.CliMain.main(CliMain.java:304)
Caused by: java.io.IOException: Stream closed
 at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:57)
 at java.io.PushbackInputStream.read(PushbackInputStream.java:149)
 at org.yaml.snakeyaml.reader.UnicodeReader.init(UnicodeReader.java:83)
 at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:113)
 at java.io.Reader.read(Reader.java:123)
 at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:147)
 ... 16 more

CliMain.java 코드를 살펴보면 loadHelp() 라는 함수에서 org/apache/cassandra/cli/CliHelp.yaml 을 찾는데 실패하는 것을 알 수 있습니다.

    private CliUserHelp loadHelp()
    {
        final InputStream is = CliClient.class.getClassLoader().getResourceAsStream("org/apache/cassandra/cli/CliHelp.yaml");
        assert is != null;

        try
        {
            final Constructor constructor = new Constructor(CliUserHelp.class);
            TypeDescription desc = new TypeDescription(CliUserHelp.class);
            desc.putListPropertyType("commands", CliCommandHelp.class);
            final Yaml yaml = new Yaml(new Loader(constructor));
            return (CliUserHelp) yaml.load(is);
        }
        finally
        {
            FileUtils.closeQuietly(is);
        }
    }

이를 해결하는 방법은 간단합니다. 해당 파일을 복사해서 org/apache/cassandra/cli/ 에 복사해주고 eclipse refresh 후에 재빌드 해주면 그 다음부터는 정상적으로 실행되게 됩니다. 아니면 이 loadhelp 이전에 호출해주는 부분을 빼버려도 가능합니다.

 

Reference: http://wiki.apache.org/cassandra/RunningCassandraInEclipse