This is a document for version-1.0.0. Old document (for version 0.0.6) is here. -> clan/0.0.6



Build Status

CLAN : Clojure, LibGDX, Android, Neko application construct kit

CLAN : Clojure, LibGDX, Android, Neko アプリケーション構築キット


  • CLAN is …
    • If you write LibGDX’s ApplicationListener by Clojure, then CLAN can run this. And, CLAN can deploy to JAR(for many desktop OS with Java), EXE(for Windows with Java), APK(for Android).
      • Therefore, you shall be able to understand LibGDX and Clojure, if you want to use CLAN.
      • CLAN include Neko (for Android).
    • CLAN can use nREPL.
    • CLAN display splash screen at boot for loading Clojure.
      • Can replace logo image.
    • CLAN is completely CLI (unnecessary GUI).
    • CLAN work on UNIX like OS, Mac, and Windows!
      • But I not yet tested on Mac, because I have not Mac, and money, sorry.
    • CLAN use lein-droid (for Android).
    • CLAN only provide boot-loader and small utilities, that is for respectable LibGDX’s philosophy. You may call LibGDX’s API directly.


  • CLANとは
    • LibGDXApplicationListenerを「Clojureで」書いたものを、実行させたり、jarやexeやapkにデプロイしたりする事のできる開発キットです。
      • よって、CLANを使いたい人はLibGDXとClojureを理解している必要があります。
      • Neko も含んでいます(android向け)
    • nREPLが使える
    • プロセス起動時のClojureロード時に起動ロゴ等の画像を表示する機能あり
      • ロゴ画像は入替可能
    • 完全にcliベースでのビルドやデプロイが可能(gui環境不要)
    • unix風環境、mac、windows環境でも動く!
    • lein-droidを使っています(android向け)
    • LibGDXの哲学に基き、ブートローダ部および一部のユーティリティ以外は提供しません。直にLibGDXのAPIを叩いてください。


  • It can start easily and quickly
  • You can make proper application(game) that works 60fps and can publish Google Play


  • 簡単にすぐ始められる
  • 60fpsで動作し、google playで公開可能な、きちんとしたアプリ(ゲーム)が作れる


  • You need know-how of Clojure and LibGDX
  • Too fat (jar:8.3M~, exe:8.4M~, apk:2.5M~)
    • But, it is average in games, because these includes many assets like images and sounds.
  • Boot slowly
  • Must need to tune-up for Android (like to make Android’s game by Java)
    • It is not need when for PC only.


  • clojure, libgdxの知識が必須
    • clojureは、プログラミングClojure第二版(amazon)読了レベル程度の知識があればok
    • libgdxは、wikiの記事とリファレンス読みながらおぼえるぐらいでok(ただしどちらも英語)
      • 日本語が良いなら、「Androidゲームプログラミング A to Z」が参考になる。詳細は#tune-up-for-android参照
  • サイズがでかい(jar:8.3M~, exe:8.4M~, apk:2.5M~)
    • ゲームの場合、そもそも画像や音源等でサイズがふくらむ為、それほど問題にはならない
  • 起動に時間がかかる
    • 自分が測定したところ、パズドラの起動ロゴ表示時間と同程度のローディング画面表示が必要。ゲームなら許容範囲内だが非ゲームなら厳しいところだと思う
  • android向けの場合、javaでandroidゲームを作る際と同様のチューニングが必須
    • PC向けの場合は、チューニングしなくても良好なパフォーマンスで動作する


Tutorial movie


Child pages

(sorry, these pages are written in japanese)

  • clan/introduction: 別に読まなくてもよい前書き
  • clan/libgdx: libgdxメモ
  • clan/license: 沢山のソフトが結合した結果、大変な事になったライセンス解説
  • clan/assets: アセット回りの話
  • clan/memo: 雑多なメモ。とりあえず何でもここに書く。あとで分類する予定。


  • PC and OS(Windows or Mac or Linux or *BSD)
  • Commonly-used CLI environment
    • sh, GNU make(gmake), GNU autotools(autoconf), wget
      • If you use Windows, these are in MinGW/MSYS.
        • But, you will be update wget’s cert, maybe.
  • JDK 1.7 or OpenJDK 1.7
  • JRE 1.7 or later or OpenJDK Runtime Environment
  • Leiningen 2.3.1 or later
  • (optional) Android SDK (for Android’s APK)
    • Android SDK Tools must be Revision or later, and Android SDK Platform-tools must be Revision 17 or later, and Android SDK Build-tools must be Revision 17 or later. Older versions couldn’t work.
  • (optional) Launch4j (for Windows’ exe)

I look see that CLAN worked on Microsoft Windows Vista(x86-32bit), and Gentoo Linux(x86-32bit) on 2013/02/28. And I look see that CLAN worked on Mac OS X(x86-64bit) on 2014/04/24.

I registered to Travis CI since at 2013/08/14.


  • PCおよびos(windowsかmacかlinuxか*bsd)
  • 一般的なCLI環境
  • JDK 1.7OpenJDK 1.7
  • JRE 1.7 もしくはそれ以降 もしくは OpenJDK Runtime Environment
  • Leiningen 2.3.1 以降
  • (optional) Android SDK (android用apkを生成したい場合のみ)
    • Android SDK Tools はバージョンが 以上、 Android SDK Platform-tools はバージョンが 17 以上、 Android SDK Build-tools はバージョンが 17 以上が必要です。古いバージョンではうまく動きません。
  • (optional) Launch4j (windows用exeを生成したい場合のみ)

2013/02/28 に、windows vista(32bit)とgentoo(x86-32bit)上にてサンプルプロジェクトのビルドが動作する事を確認しています。 また2014/04/24に、mac(x86-64bit)上にて動作を確認しています。

2013/08/14 より、Travis CI上にてサンプルプロジェクトのビルドテストを行うようになりました。

windows環境での各種のインストールについては、 env が参考になるかもしれません。



Prepare to develop and run sample application for test


Spreading project directory

mkdir -p package/projname
cd package/projname
git clone
cd clan
git tag
git checkout 0.2.0
cd ..
sh clan/script/
  • You decide package and projname as you likes
  • You decide target of checkout from git tag
  • Run clan/script/, then spread many files to package/projname/
  • There is assumed below directory strucuture.
    • package/projname/clan/ : CLAN main unit, you don’t need to edit in this directory.
    • package/projname/ : there is in your application project files.
    • package/ : You can set Makefile(or other script for build) for distributing built files(jar/exe/apk) by youself. (optional)
      • For example: zipping exe and README.txt, push APK to google play, etc…
    • package/.git or package/projname/.git : save your project to git (or other revision-control-system) repository. (optional)
      • clan/script/ makes package/projname/.gitignore, that exclude to package/projname/clan/ .


mkdir -p package/projname
cd package/projname
git clone
cd clan
git tag
git checkout 0.2.0
cd ..
sh clan/script/
  • packageprojname を好きに決めます。
  • git tag を見て、どのバージョンをcheckoutするか決めます。
  • clan/script/ を実行します。すると package/projname/ の中に大量のファイルが展開されます。
  • これらは以下のようなディレクトリ構成を想定しています。
    • package/projname/clan/ : CLAN本体、あなたがこの中をいじる必要は通常はありません
    • package/projname/ : あなたのアプリのプロジェクトのファイルはこの中に置きます。
    • package/ : ここに、リリース向けとして生成した jar, exe, apk を配布向けにパッケージングする為の Makefile(もしくは他のビルド用スクリプト等)を自由に置く事ができます(optional)
      • 例: exeファイルとREADME.txtをセットでzipに固める。apkファイルをgoogle playにpushする。等々…
    • package/.git もしくは package/projname/.git : あなたのプロジェクトをgit(もしくは他のリビジョン管理システム)に保存する為の何かも設置できます(optional)
      • clan/script/ スクリプトは package/projname/.gitignore も生成します。これには package/projname/clan/ を除外する設定が入っています。

Build and run sample application on desktop

autoconf && ./configure
make run

This sample application is named “drop” or “space drop”.

(This game’s rule is based on, I rewrite by Clojure and add more gimmics. )

CLAN’s control as long as display boot-logo.

  • This is for loading clojure on background.
  • You can change boot-logo image file and boot-jingle sound file at later.

If “drop” works done, then finish application process, and go next.

(I explain to description of autoconf && ./configure, and targets of make, but it is at later.)

This is run application with nREPL.

make repl

But, it take very long time at boot, display a lot of reflection warnings, and that rerun with some defects in nREPL. I guess, will almost use make run in cycle of develop. And, will use make repl for chase to very difficult bugs.

The sample application’s source code is in src/drop/main.clj.

Read this, and input to nREPL console as you likes.

(For example, change and input to (def speed-level 100), (def item-spawn-interval 100000000000), etc…)

If you see to work nREPL, then finish application process, and go next.


autoconf && ./configure
make run

このサンプルアプリは「drop」「space drop」という名前です。

(このゲームは のルールをベースにClojureで書き直し、色々な要素を追加しています)

アプリが起動すると、起動ロゴが表示されている間はCLANの が制御を握ります。

  • ロゴの出ている間、バックグラウンドではclojureのロードが行われています
  • 起動ロゴや起動音の差し替えができます。


( autoconf && ./configure の詳細や make のターゲットについてはまた後で解説します。)


make repl

しかし、nREPL経由だと起動までに非常に時間がかかり、大量のreflection warningが表示され、しかもnREPL内にてアプリ起動を複数回行うと色々な問題が発生する事が分かっています。 なので、通常の開発時は主にmake runを使って開発を行い、make replを使うのは難しいバグを追跡している時だけにするのが良いと思います。

サンプルアプリのソースは src/drop/main.clj にあります。


(例えば、ソースから「(def speed-level 100)」「(def item-spawn-interval 100000000000)」のようなところを拾ってきて、数値を変更してnREPLに入力してみるとか)


Build and run sample application on android


If you install Android SDK, you can run sample application on android.

You shall connect Android-debug-usb, or run Android emulator.

make android-run

To build for Android need very large memory(over 1-2G) and some minutes(over 5min).



android sdkをインストールしているなら、サンプルアプリをandroid上で動かす事ができます。


make android-run


Clean up sample application

make distclean

Delete almost temporary files and clean up to sample application.


make distclean


Develop your application

  1. Edit file
    • Do you know autoconf? It is not difficult.
      • dnl is comment
      • AC_INIT() is to define artifactId and version
      • FOO="string" is to define local variables
      • AC_SUBST() is to define project’s variables
      • If you execute autoconf && ./configure command, then that generate from * to *.clj.
        • At which time, a string as @FOO@ in * was replaced to project variables by defined AC_SUBST().
    • You modify in section of dnl Defines in file for your application.
  2. Edit layout/, layout/ and android/
    • If you don’t want to deploy Android’s APK, then you can ignore layout/ and android/
    • A file layout/ is boot entry class for desktop build. It is relocate to desktop/src-java/(PROJECT_GROUPID)/
      • If you want to customize LWJGL process or configuration of CLAN, then you can edit this.
    • A file layout/ is boot entry class for android build. It is relocate to android/src-java/(PROJECT_GROUPID)/
      • If you want to customize Android process or configuration of CLAN, then you can edit this.
  3. Discard source of sample application src/drop/, and create source of your application src/...
    • For example, if you deside PROJECT_CAL_GENERATOR_CLASS in to “”, then you shall create src/my/app/main.clj. This file is main sources of your application. You can put also other source files too, of course.
    • For example, if you deside PROJECT_CAL_GENERATOR_FN in to “generate-al”, then you shall write to function like (defn generate-al [] (proxy [ApplicationListener] [] ...) in src/my/app/main.clj.
      • It is smallest application code only flashing screen.

            (com.badlogic.gdx Gdx ApplicationListener)
            ( GL10)))
        (defn generate-al []
          (proxy [ApplicationListener] []
            (create [] nil)
            (resume [] nil)
            (resize [w h] nil)
            (render []
              (.. Gdx gl (glClearColor (rand) (rand) (rand) 1.0))
              (.. Gdx gl (glClear GL10/GL_COLOR_BUFFER_BIT)))
            (pause [] nil)
            (dispose [] nil)
  4. Edit
    • If you want to import/use external libraries to your project from and other repos, then add external libraries to dependencies-common in
      • If you want to add only desktop/android, add to dependencies-desktop/dependencies-android in
  5. Execute autoconf && ./configure
    • It generate from path/to/ to path/to/foo.suffix.
    • If you change *.in files later, then you must execute autoconf && ./configure again, you don’t forget it.
      • Added to which, if you change layout/*.in files, then you must execute make layout-clean layout. Because, these files must relocate to desktop/src-java/... or android/src-java/....
  6. Remove resources of sample application, and put resources of your application
    • desktop/assets/
      • Put in here to your application’s resources(image files, sound files, and other).
        • How to get out to resouces from here: (.. Gdx files (internal "assets/filename.suffix"))
      • This is in desktop/, but this is also used for Android too.
    • desktop/assets/cbl_logo.png and desktop/assets/cbl_jingle.ogg
      • These are used by as default (see layout/*.in).
      • If these files not exists, then not display logo-image, or not play jingle-sound.
    • desktop/assets/process_icon/
      • This is include process-icon files for LWJGL (see layout/
        • If not exists, be used to LWJGL default process-icon.
    • tas/
      • If you put image files into tas/***/, then these is packed by TexturePacker to desktop/assets/(dir-name).{atlas,png} automatically.
        • You can do make tas to pack any time.
      • If you don’t use TextureAtlas, then you will clear out this.
    • android/res/
      • Icons for Android.
    • l4j/windows.ico
      • Icon for Windows.
      • You can make icon for windows by GIMP.
  7. Execute make run
    • Build and run your application.
    • If it don’t work, unexpected work, raised error, then you may fix your code, and retry make run.
      • Or it is bug of CLAN. Check and post issues.
      • If you update to src/... then you can retry make run directly, but if you update to outside of src/... then you may execute make clean and make run for safety.
    • I describe targets of make later.
  8. Execute make android-run (optional)
    • You shall install Android SDK, and you shall connect Android-debug-usb or run Android emulator before make android-run.
    • This require time and memory.


  1. ファイルを編集する
    • autoconf は分かりますか?難しくはないです。
      • dnl は一行コメント
      • AC_INIT() で、 artifactIdとバージョンを定義
      • FOO="string" で、ローカル(configure.ac内)変数を定義
      • AC_SUBST() で、プロジェクト変数を定義
      • autoconf && ./configure を実行する事で、 * のようなファイルから *.clj が生成される。
        • この時、 * 内にある @FOO@ のような文字列は、 AC_SUBST() で定義した変数の内容に置換される。
    • 内の dnl Defines の各変数の内容を、あなたのアプリ用に変更しておいてください。
  2. layout/ layout/ android/ を編集する
    • android用apkを生成しないのであれば、 layout/ android/ は無視してよいです。
    • layout/ にはdesktop向けビルド時の起動クラスが入っています。このファイルから生成される は、 desktop/src-java/(PROJECT_GROUPID)/ に再配置されます。
      • このファイルを編集する事で、desktop向けのLWJGLプロセスの設定をいじる事ができます。
    • layout/ にはandroid向けビルド時の起動クラスが入っています。このファイルから生成される は、 android/src-java/(PROJECT_GROUPID)/ に再配置されます。
      • このファイルも同様に、androidプロセス等の設定をいじれます。
  3. src/drop/ に入っているサンプルアプリのソースを捨て、 src/... として、あなたのアプリのソースを入れます。
    • 先ほどの にて、 PROJECT_CAL_GENERATOR_CLASS に “” を指定した場合、あなたは src/my/app/main.clj を書く事になります。勿論、このファイルから参照する他の *.clj を一緒に含めても問題ありません。
    • また同様に、先ほどの にて、 PROJECT_CAL_GENERATOR_FN に “generate-al” を指定した場合、あなたは src/my/app/main.clj の中に「(defn generate-al [] (proxy [ApplicationListener] [] ...)」のような関数を書く必要があります。
      • 以下は画面をフラッシュさせるだけの最小限のアプリのソースです。

            (com.badlogic.gdx Gdx ApplicationListener)
            ( GL10)))
        (defn generate-al []
          (proxy [ApplicationListener] []
            (create [] nil)
            (resume [] nil)
            (resize [w h] nil)
            (render []
              (.. Gdx gl (glClearColor (rand) (rand) (rand) 1.0))
              (.. Gdx gl (glClear GL10/GL_COLOR_BUFFER_BIT)))
            (pause [] nil)
            (dispose [] nil)
  4. を編集する
    • clojars.org等から外部ライブラリをimportしたい場合、このファイルの中の dependencies-common に追加します。
      • ただし、desktop向け/android向け限定にしたい場合は、 dependencies-dependencies もしくは dependencies-android に追加します。
  5. autoconf && ./configure を実行する
    • 先ほどの説明通り、これで path/to/ から path/to/foo.suffix が生成されます。
    • この後でもし *.in ファイルの内容を変更した時は、必ず忘れずに autoconf && ./configure を再実行してください。そうしないと変更内容が反映されません。
      • なお、もし変更したファイルが layout/*.in だった場合、上記に加えて make layout-clean layout も実行する必要があります。これは、 layout/ 配下のファイルは desktop/src-java/... 等に再配置される必要があるからです。
  6. 以下の各ディレクトリに入っているサンプルアプリのリソースを削除し、代わりにあなたのアプリのリソースを入れます
    • desktop/assets/
      • ここにはアプリ自体が利用する各種のリソースファイル(画像、サウンド、その他各種何でも)を入れます。
        • 入れたリソースファイルを取り出すには「(.. Gdx files (internal "assets/filename.suffix"))」のように指定します。
      • このディレクトリは desktop/ の中にありますが、desktop向けに限らず、android向けの場合でもこのディレクトリが参照されます。
    • desktop/assets/cbl_logo.pngdesktop/assets/cbl_jingle.ogg
      • この二つのファイルは が起動ロゴ/起動SEとして使用します。このファイル名は変更可能です(layout/*.in を見てください)。
      • これらのファイルが存在しない場合は、単に起動ロゴは表示されず、起動SEも再生されないだけです。
    • desktop/assets/process_icon/
      • ここにはLWJGL(desktopプロセス)用のアイコンを入れます(これも layout/ でファイル名を変更できます)。
        • このアイコンがない場合、LWJGLロゴのデフォルトアイコンが使われます。
    • tas/
      • ここに画像ファイルの入ったディレクトリ(複数可)を入れると、ビルド時に自動的に TexturePacker が実行され、 desktop/assets/(ディレクトリ名).{atlas,png} として生成されます。
        • make tas を実行する事で、いつでも再生成が可能です。
      • 上記のTextureAtlasを使わない場合は、このディレクトリは空にしておけばokです。
    • android/res/
      • android用アプリアイコンを入れます。
    • l4j/windows.ico
  7. make run を実行する
    • あなたのアプリをビルドし、その後に起動します。
    • もしうまく動かなかったり、予想と違う動きをしたり、エラー例外を投げたりした場合、ソースを修正してからまた make run を実行してみてください。
      • もしくはCLANのバグかもしれません。githubのissuesをチェックしたり投稿したりしてみてください。
      • src/... の中を修正した時は make run を再実行するだけでokですが、 src/... の中以外を修正した時は、念の為に make clean してから make run した方がよいです。
    • make の他のターゲット指定についてはまた後で説明します。
  8. make android-run を実行する(optional)
    • 実行前にandroid sdkをインストールし、androidデバッグusb接続もしくはandroidエミュレータ起動をしておいてください。
    • これには結構な時間と大量のメモリが必要です。

Release your application


Prepare for release

  1. Edit
    • Change version string for release
    • Increment PROJECT_ANDROID_VERSIONCODE (for Android’s APK)
  2. Make release-tag or release-branch (if needed)

  3. Do autoconf && ./configure


  1. をいじる
    • バージョン文字列をリリース用に変更
  2. 必要に応じて、リリースタグやリリースブランチを作成

  3. ファイルをいじったので、 autoconf && ./configure を実行

Build jar of release-version for desktop

make release-jar

And, built target/{artifactId}.jar.

NOTE: It include make desktop-clean for safety.


make release-jar

これで target/{artifactId}.jar が生成される。

注意:この際に、安全の為に make desktop-clean が実行されます。

Build exe of release-version for windows

It is required to Launch4j.

make release-exe

And, built target/{artifactId}.exe from target/{artifactId}.jar.


Launch4j が必要です。

make release-exe

これで target/{artifactId}.jar から target/{artifactId}.exe が生成される。

Build APK of release-version for android

It requires below list.

You should edit ~/.lein/profiles.clj, add :clan-sign entry.

 :clan-sign {:android {:keystore-path "d:/home/.android/foo.keystore"
                       :key-alias "foo"
                       :sigalg "SHA1withRSA"
                       :keypass "password" ; optional
                       :storepass "password" ; optional
  • :keystore-path, :key-alias : Private key.
  • :sigalg : Algorithm of sign. If you key is RSA then “SHA1withRSA”, or else if you key is DSA then “SHA1withDSA”.
  • :keypass, :storepass : Passwords. If you not set these, you will enter password on build-time.
  • These parameter’s description is on sample of lein-droid’s project.clj. And you can read lein-droid’s tutorial.
make release-apk

It takes long time.

And, built target/{artifactId}.apk.

NOTE: It include make android-clean for safety.

WARNING: :clan-sign profile is only used on release time. Debug(devel) version’s APK are signed by auto-generated private key for debug.



~/.lein/profiles.clj:clan-sign エントリを追加しておく必要があります。

 :clan-sign {:android {:keystore-path "d:/home/.android/foo.keystore"
                       :key-alias "foo"
                       :sigalg "SHA1withRSA"
                       :keypass "password" ; optional
                       :storepass "password" ; optional
  • :keystore-path, :key-alias : リリース用の鍵ファイルおよび鍵のエイリアス名を設定します。
  • :sigalg : 署名アルゴリズム指定です。上記の鍵を RSA で生成した場合は “SHA1withRSA” を、 DSA で生成した場合は “SHA1withDSA” を指定してください。
  • :keypass, :storepass : 鍵のパスワードです。設定しない場合はリリースビルド時にパスワードを聞かれるので入力する必要があります。
  • これらのパラメータの詳細はlein-droidのproject.cljのサンプルにあります。lein-droidのチュートリアルも参照してみてください。
make release-apk


これで target/{artifactId}.apk が生成されます。

注意:この際に、安全の為に make android-clean が実行されます。

要注意: :clan-signプロフィールはリリース時のみ使われます。デバッグ版のapkは、自動生成されたデバッグ用の鍵によって署名されます。

Build all

make release

And, built target/{artifactId}.jar, target/{artifactId}.exe and target/{artifactId}.apk.

リリース版のjar, exe, apkを一度にビルドする

make release

これで target/{artifactId}.jar target/{artifactId}.exe target/{artifactId}.apk が生成されます。

Other work for release

  • Do final check to built files.
  • Packaging for distribution (if needed)
    • You put in files to bundle/win/ and bundle/jar/, and you run make package, so you get target/{artifactId}-{version} and target/{artifactId}-{version}
  • Register Google Play and other distribution site (if needed)
  • Change files for devel (if needed)
    1. Edit for version string
    2. Do autoconf && ./configure


  • 生成されたファイルを動かしてみて、最終チェックを行います。
  • 必要に応じて、配布用にパッケージングします(README.txtを同梱したり等)。
    • bundle/win/ および /bundle/jar/ に同梱したいファイルを入れ、 make package を実行すると、 target/{artifactId}-{version}-win.ziptarget/{artifactId}-{version} が生成されます。
  • 必要に応じて、google playに登録したり、配布サイトに設置したりします。
  • 必要に応じて、リリース向けに変更していた部分を開発向けに戻します。
    1. のバージョン文字列など
    2. 変更したら、 autoconf && ./configure を実行

Directory structure

I suppose to setup by #spreading-project-directory (there is in package/projname/).

  • package/projname/clan/ : CLAN main unit, you don’t need to edit in this directory.
    • package/projname/clan/cbl/ :, claninfo.clj and clanutil.clj are in here.
  • package/projname/.gitignore : it exclude to package/projname/clan/ from your project’s .git/.

  • package/projname/src/ : your source is in here.
  • package/projname/src-java/ : your java source is in here(optional).

  • package/projname/desktop/ : There is to build for desktop, and debug-run environment.
    • package/projname/desktop/assets/ : There is enclose any resource files for your app. Not only for desktop but also for Android.
      • package/projname/desktop/assets/cbl_logo.png : boot-logo
      • package/projname/desktop/assets/cbl_jingle.ogg : boot-se
      • package/projname/desktop/assets/(dir-name).atlas : generated by TexturePacker from package/projname/tas/***/
      • package/projname/desktop/assets/(dir-name).png : ditto
      • package/projname/desktop/assets/process_icon/ : There is enclose process icons for desktop
      • package/projname/desktop/assets/drop/ : resources for sample app (it isn’t need for your app, can be discarded)
  • package/projname/android/ : There is to build for Android.
    • package/projname/android/res/ : There is enclose res for Android
    • package/projname/android/ : source of AndroidManifest.xml
  • package/projname/l4j/ : There is for launch4j.
    • package/projname/l4j/windows.ico : Icon for Windows’ exe.
  • package/projname/layout/ : There is enclose to boot entry class

  • package/projname/tas/ : There is enclose to source images of TexturePacker (see #develop-your-application).

  • package/projname/tmp/ : There is temporary directory for expand libgdx.

  • package/projname/target/ : There is enclose to target files like app.jar, app.exe, app.apk (and related other temporary files) for release.

  • package/projname/bundle/ : There is put in bundled files when make package.
    • package/projname/bundle/win/ : For Windows
    • package/projname/bundle/jar/ : For Unix like OS (include Mac)


#spreading-project-directory でのセットアップを前提としています(package/projname/ に配置している想定です)。

  • package/projname/clan/ : CLAN本体、基本的にはいじる必要はありません。
    • package/projname/clan/cbl/ : claninfo.clj clanutil.clj が入っています
  • package/projname/.gitignore : あなたのプロジェクトの .git/ から、 package/projname/clan/ を除外する設定が含められています

  • package/projname/src/ : ここにあなたのclojureコードを入れます
  • package/projname/src-java/ : ここにあなたのjavaコードを入れます(オプショナル)

  • package/projname/desktop/ : デスクトップ向けビルド用、兼、開発時実行環境
    • package/projname/desktop/assets/ : あなたのアプリが参照する各種のリソースファイル置き場。android向けビルドでもここが参照される
      • package/projname/desktop/assets/cbl_logo.png : 起動ロゴ
      • package/projname/desktop/assets/cbl_jingle.ogg : 起動効果音
      • package/projname/desktop/assets/(ディレクトリ名).atlas : 後述の package/projname/tas/ から生成される、 TextureAtlas 用のファイル
      • package/projname/desktop/assets/(ディレクトリ名).png : 同上
      • package/projname/desktop/assets/process_icon/ : desktop向けプロセスアイコン置き場
      • package/projname/desktop/assets/drop/ : サンプルアプリ用のリソース一式。捨ててよい
  • package/projname/android/ : android向けビルド用
    • package/projname/android/res/ : androidのres置き場
    • package/projname/android/ : AndroidManifest.xml の元
  • package/projname/l4j/ : launch4j用
    • package/projname/l4j/windows.ico : exeファイルのアイコン
  • package/projname/layout/ : デスクトップ/androidの各ブート部分が入っている

  • package/projname/tas/ : TexturePackerでpackする元画像置き場(詳細は#develop-your-application参照)

  • package/projname/tmp/ : libgdx配布物を展開する一時ディレクトリ

  • package/projname/target/ : リリース版の app.jar app.exe app.apk およびリリースに関連する一時ファイル置き場

  • package/projname/bundle/ : make package時の同梱ファイル置き場
    • package/projname/bundle/win/ : windows向け
    • package/projname/bundle/jar/ : 非windows向け


CLAN supply claninfo.clj and clanutil.clj.

(require '[ :as claninfo])

claninfo/is-release? ; => true or false
claninfo/clan-clojure-version ; => "1.5.0"
; ... (and more vars, please see
; ... (他にも沢山の変数があります、 を見てください)
(require '[ :as clanutil])

  (prn "disable wizard-mode")
  (prn "a payment handling for desktop")
  (prn "a payment handling for android")
  (prn "enable wizard-mode")
; ... (and more fns, please see clanutil.clj)
; ... (他にも沢山の関数があります、 clanutil.clj を見てください)

;; this is for explicit manipulation to shutdown process by user
;; これを実行すると次回の実行時にも強制的にブートロゴを表示させます

(clanutil/set-jingle-off-by-pref! boolean)
;; play/mute boot-jingle on boot time. It is memoized by file(for desktop) or Preferences(for Android)
;; 起動SEを有効化/無効化します。この設定はファイルもしくはPreferencesに記憶されます

(clanutil/is-jingle-off-by-pref?) ; => true or false

(clanutil/get-package-type) ; => :apk or :exe or :jar (it return :jar when make run/repl)
(clanutil/get-os-type) ; => ; => :android or :windows or :unix

See clan/cbl/src/jp/ne/tir/clan/ and clan/cbl/src/jp/ne/tir/clan/clanutil.clj for more information.

詳細は clan/cbl/src/jp/ne/tir/clan/claninfo.clj.inclan/cbl/src/jp/ne/tir/clan/clanutil.clj を見て確認してください。

List of targets for make

Refer to for more information.


詳細は を確認してください。


  • make dep
    • Fetch jars to clan/depinst/repos/ for for Android.
    • android向けの の為に、 clan/depinst/repos/ 内にjarをダウンロードします。
  • make tas
    • Build desktop/assets/(dir-name).{atlas,png} from tas/***/ by TexturePacker.
    • TexturePackerを使い、 tas/***/ から desktop/assets/(ディレクトリ名).{atlas,png} を生成します。
  • make layout
    • Relocate from layout/*.java to desktop/src-java/.../ or android/src-java/.../
    • layout/*.java を、 desktop/src-java/.../Desktop.javaandroid/src-java/.../ へと配置します。


  • make hiero
  • make particleeditor
  • make texturepacker2 SRCDIR=dir DSTDIR=dir2 NAME=foo
    • Run TexturePacker2 with parameters. It generates $DSTDIR/$NAME.atlas and $DSTDIR/$NAME.png from image files and pack.json in $SRCDIR.
    • TexturePacker2を引数と共に実行します。$SRCDIR に入っている画像および pack.json より、$DSTDIR/$NAME.atlas$DSTDIR/$NAME.png が生成されます。

For desktop or development

  • make devpack
    • Build temporary jar for debug.
    • 開発用の一時jarを生成します。
  • make run
    • Run your application.
    • あなたのアプリを起動します。
  • make repl
  • make pack
    • Build jar for release (for internal use).
    • リリース版のjarをビルドします(内部用)。
  • make test
    • Run lein test. You may wrote test, of course.
    • lein test を実行します。当然、事前にtestを書いておく必要があります。

For Android

  • make android-build
    • Build temporary files for debug (for internal use).
    • 開発用の中間ファイルを生成します(内部用)。
  • make android-apk
    • Build APK for debug.
    • 開発用のapkを生成します。
  • make android-install
    • Install APK (for debug) to device.
    • 開発用のapkを端末にインストールします。
  • make android-run
    • Run APK (for debug) in device.
    • 開発用のapkを端末で実行します。
  • make android-repl
    • Run APK (for debug) with nREPL console(sorry, now preparing).
    • 開発用のapkを端末にてnREPLコンソール付きで実行します(すいません、まだ準備中です)。

For releases

  • make release-jar
    • Build jar for release.
    • リリース版のjarをビルドします。
  • make release-exe
    • Build exe for release.
    • リリース版のexeをビルドします。
  • make release-apk
    • Build APK for release.
    • リリース版のapkをビルドします。
  • make release
    • Build JAR, EXE, and APK for release.
    • リリース版のjar, exe, apk全部をビルドします。
  • make release-apk-install
    • Install APK (for release) to device. It requires make release-apk.
    • リリース版のapkを端末にインストールします。 make release-apk を先に実行しておいてください。
  • make release-apk-run
    • Run APK (for release) to device. It requires make release-apk-install.
    • リリース版のapkを端末から起動します。 make release-apk-install を先に実行しておいてください。
  • make debug-jar
    • Build jar for debug.
    • デバッグ版のjarをビルドします。リリース版との違いは、claninfo.cljのデバッグフラグが有効になっている点のみです。
  • make debug-exe
    • Build exe for debug.
    • デバッグ版のexeをビルドします。
  • make package-win
    • Create a zip for Windows.
    • windows向けパッケージのzipを生成します。
  • make package-jar
    • Create a zip for Unix like OS(include Mac).
    • 非windows向けパッケージのzipを生成します。
  • make package
    • Run make package-win package-jar.
    • make package-win package-jar を実行します。


  • make depclean
    • Clean up clan/depinst/repos/ for for Android.
    • android向けの の為に使用している clan/depinst/repos/ を綺麗にします。
  • make tas-clean
    • Remove desktop/assets/(dir-name).atlas and desktop/assets/(dir-name).png.
    • desktop/assets/(dir-name).atlasdesktop/assets/(dir-name).png を削除します。
  • make layout-clean
    • Remove files that were generated by make layout.
    • make layout によって生成されたファイルを削除します。
  • make desktop-clean
    • Cleanup files that related to desktop builds.
    • desktop向けビルドの中間ファイルを削除します。
  • make android-clean
    • Cleanup files that related to Android builds.
    • android向けビルドの中間ファイルを削除します。
  • make release-clean
    • Remove target/*.
    • target/* を削除します。
  • make clean
    • Do make desktop-clean android-clean layout-clean ta-clean. WARNING: It is not include make release-clean.
    • make desktop-clean android-clean layout-clean ta-clean を実行します。注意: make release-clean は含んでいません。
  • make ac-clean
    • Remove to files that were generated by autoconf && ./configure.
    • autoconf && ./configure によって生成されたファイルを削除します。
  • make distclean
    • Do make clean ac-clean release-clean
    • make clean ac-clean release-clean を実行します。
  • make maintainer-clean
    • Do make distclean, and remove
    • make distclean を実行し、更に も削除します。

Tune-up for Android

  • Enabling *warn-on-reflection*, and insert type specifier.
  • Reduce GC whatever possible in render().
    • So, you cannot use clojure’s immutable data-type in most case, alternatively you may use java’s array.
  • Inlining from function to macro.
  • search and read article or book for optimizing android app by Java.

  • *warn-on-reflection* を有効にし、型指定を追加しまくってみる。
  • 一定間隔でガクガクする場合はGCが原因なので、可能な限りrenderハンドラ内でオブジェクト生成しないようにする。
    • つまり、clojureのimmutableなデータ型が使えない場合が多い。java arrayを多用する必要がある。
  • 関数呼び出しもそこそこコストが高いのでマクロを使ってインライン化してみる(つまりreduceとかは使いづらい)。
  • 既存のandroid向けjavaチューニングの記事や本を探して参考にする。
  • clan/memo, clan/libgdx にも少し情報を書いた。

How to maintain CLAN itself

This section is for me.

CLAN was developed with sample app.




Develop CLAN

mkdir -p clan_parent
cd clan_parent
git clone
sh clan/script/
  • It isn’t need to project directory, because sample app hasn’t respository
  • Do git clone from ssh, not https(because, https is readonly)
  • expand sample files

May develop CLAN with sample app. And edit sample app sources (src/) and inside clan/.

If you want to commit to repository, then you do to command like below.

make distclean
rm -rf clan/sample/*
cp -a .gitignore android bundle \
desktop l4j layout src src-java tas clan/sample
cd clan
git status
git diff
git add ...
git commit
cd -

Point is to get back to edit files to clan/sample/.

NOTE: you may check git diff for local changes.

Release sample app (if needed)


mkdir -p clan_parent
cd clan_parent
git clone
sh clan/script/
  • サンプルアプリは独自のリポジトリを持たないので、プロジェクトディレクトリを作る必要はない
  • git clone はhttpsではなく、sshで行う(pushするので)
  • 通常と同様にファイルを展開している

これでサンプルアプリとCLANを開発できるようになったので、サンプルアプリのソース(src/)と clan/ 内を編集する。


make distclean
rm -rf clan/sample/*
cp -a .gitignore android bundle \
desktop l4j layout src src-java tas clan/sample
cd clan
git status
git diff
git add ...
git commit
git push
cd -

要は、編集した各ファイルを clan/sample/ に戻している。

注意: git diff をチェックして、ローカルな変更をコミットに含めてしまわないよう確認した方がよい。


  • この手順は #release-your-application を参照
  • 必要に応じて、サンプルアプリの配布物を公開する事。google playにも登録する事

Release CLAN

  1. Add record for release to ChangeLog
    • Must check git log and append important changes to ChangeLog
  2. Edit script/ and remove -SNAPSHOT from version string
  3. Edit latest version information in
  4. git add ChangeLog script/
  5. git commit -m 'version X.Y.Z releasing'
  6. git tag -a X.Y.Z -m 'a description'
  7. Edit script/ and increment version string and add -SNAPSHOT to version string
  8. git add script/
  9. git commit -m 'version X.Y.Z released'
  10. git push
  11. git push origin --tags
  12. Edit page!), and press “公開サイトに反映” button.
    • Modify “Latest version” on a description
    • Append important changes to this document if exists


  1. ChangeLog にリリースの記録を行う
    • gitのコミットログを確認し、重要な変更点があるならきちんと記入する事
  2. script/ のバージョン番号から、 -SNAPSHOT を除去
  3. の最新バージョン情報の記述を変更
  4. git add ChangeLog script/
  5. git commit -m 'version X.Y.Z releasing'
  6. git tag -a タグ名 -m 'メッセージ'
  7. script/ のバージョン番号を上げ、 -SNAPSHOT を付与
  8. git add script/
  9. git commit -m 'version X.Y.Z released'
  10. git push
  11. git push origin --tags
    • 概要のところの「現在のバージョン」を更新
    • 重要な変更内容を追記(もしあるなら)


How to use external library from clojars and etc
Edit and do autoconf && ./configure
I want to separate process by desktop or Android
You can use keep-code-when-desktop and others by These can includes to import, use and other special-forms because that do code-elimination at compile-time.
I have some troubles on Android
My app is too slow on Android.
See #tune-up-for-android. Cause errors by memory or GC on generate dex for Android.
It requires many memories. You change :dex-opts in, and do autoconf && ./configure. Have error private key algorithm is not compatible with signature algorithm on generate APK
See #build-apk-of-release-version-for-android and edit ~/.lein/profiles.clj. Cannot build APK by other reasons.
you append DEBUG=1 to make command, like DEBUG=1 make android-run. It is lein-droid’s verbose-output option. This imformation may help to research problem.
How to upgrade CLAN
Do cd clan, git pull and git checkout x.y.z (tag list). but, you must check to ChangeLog for incompatible changes at before.
Sometimes, updated in clan/sample/ when bump version. You may replace it by hand, if you don’t modify (It is very inconvenience, so I want to refine it in future.)
I want to change/erase boot display output, boot logo and other. / I want to change process’ window-size and other for Desktop PC.
You edit layout/*
See for Desktop PC.
I want to change boot screen more better.
You edit clan/cbl/src-java/jp/ne/tir/clan/, and please send pull-req to me.
Not display boot-logo to boot at second time and more
Boot-logo is for to wait to loading clojure core. But almost processes were reused on Android, So not need to display boot-logo to boot at second time and more. Even so, if you want to display boot-logo, you may call (set-display-bootlogo-in-android!).
Vars/functions were kept to defined/modified by previous execution while reboot Android machine
Finished Processes were reused on Android. You may use another Android apps like “task killer” for debug-version. But, you must be careful to change global mutable states, or you must remember to initialize these on start.
Edit files and do make run that works, but Edit files and do make android-run that not work (not reflected from modified sources)
Sorry, do make android-clean android-run.
How to use neko
Libgdx not provide to manipulate Android’s activity. Neko have this function. If you want to manipulate Android’s activity, you can use neko. See document of neko.
Couldn’t work make repl
Maybe you may find compile error in many warnings. fix this line.
Occured NullPointerException in make tas (TextureAtlas)
Maybe that packed data are too large. You can enlarge maxWidth and maxHeight on pack.json in tas/***/. See
What is CLAN logo?
This is my family emblem. Change more better logo on later. (because it is too cutting corners.) logo’s emblem part came from eps-file that distributed by
What is assets of sample game?
All assets were made by me. Related information is in clan/assets(sorry, this page was written in japanese).
Other questions
Please write to (can write both english and japanese).


外部ライブラリを使いたい を編集し、 autoconf && ./configure を実行してください
#tune-up-for-android を見てください dex生成時にメモリ回りやGCのエラーが出る
android sdkによるdex生成は非常にメモリを消費します。のところをいじって使用メモリ量を増やしてください(増やした後はautoconf && ./configure実行も必要) apk生成時に private key algorithm is not compatible with signature algorithm というエラーが出る
鍵のアルゴリズムと署名のアルゴリズムが一致していません。 #build-apk-of-release-version-for-android を見ながら ~/.lein/profiles.clj を変更してみてください。 その他、android向けビルドが上手く動かない
DEBUG=1 make android-run のようにDEBUG=1をつける事で、lein-droidのログ出力が詳細になります。ヒントになる情報が出るかも(出ないかも)
cd clan してから、 git pullgit checkout x.y.z を実行してください(タグ一覧)。ですが、ChangeLogに非互換な変更がないかどうかを先に確認しておいてください。
たまに clan/sample/ 配下の 等が更新されています。古いプロジェクトで特に 等をいじっていない場合は、手で更新してください(これは不便なので将来的には何とかしたいです)。
起動ロゴ、起動時表示内容、等々を変更したい / PC向けデプロイ時で、ウィンドウサイズやリサイズ設定等を変更したい
layout/* をいじってください。
PC向け設定可能項目については、 を参照してください(何故かこの辺りはjavadocにされてない)。
clan/cbl/src-java/jp/ne/tir/clan/ をいじってください。よかったらpull-reqもしてください。
android実機では一度起動したプログラムはしばらくキャッシュされる為、二回目以降の起動は高速に行えます。起動画面は起動に時間がかかるのをごまかす為のものなので、高速起動できるなら起動画面を出す必要はないので、バージョン0.0.4からは出さないようにしました。それでも起動画面を出したい場合は、 (set-display-bootlogo-in-android!) を実行してください。
「task killer」系のアプリを使って完全に終了させない限り、プロセスは再利用されます。詳細はclan/libgdx#androidのdexキャッシュ問題を見てください。
ファイルを変更してから make run を実行しても反映されているが、ファイルを変更してから make android-run を実行しても反映されない
現在のところは仕様です。make android-clean android-run を実行してください。
make replが動かなくなった
うちの家の家紋です。あとでもっとちゃんとしたロゴを作る(あまりにも手抜きなので)。家紋部分は からepsファイルを貰ってきて加工して作った。
その他の質問 にお願いします(日本語でok)。


java.lang.IllegalArgumentException: already added: というエラーが出る
おそらく、 :dependencies に指定しているパッケージのどれか二つ(もしくはclojure本体)が、ある一つのパッケージに依存しており、しかも別々のバージョンが指定されています。 にて、 :exclusions オプションを使い該当モジュールを除外してください。場合によっては該当モジュールを :scope "provided" 指定でdependenciesに含める必要があるかもしれません。これらのオプションの詳細についてはLeiningenのリファレンスを参照してください。 Duplicate files at the same path inside the APK というエラーが出る
:dependencies に指定しているパッケージのjar内のファイルが衝突しています。clojure製ライブラリを :use-resources すると高確率で project.clj が衝突します。これについての解決策はまだ模索中です。
この問題に対して、 maven-android-plugin では、extractDuplicatesオプションを指定する事で許可できるようだけれども、同じ事をlein-droidでやるにはどうすればいい?
一部のモジュール(というか、org.clojure/tools.reader)をdependenciesに含めたら、起動時にstack overflowで死ぬ


  • be able to work make android-repl

  • をさわってみて、ちゃんと動いて役立つようなら組み込む

  • support iOS and GWT
    • I need iOS-machine and mac, but I haven’t money
  • isolate desktop/ for make run
    • if target application make temporary files, that get desktop/ messy.
  • simplify spaghetti build process (but it is difficult)
    • remove autoconf (if possible)
    • remove Makefile (if possible)
  • get together information for license
    • ぶらり猫のスタッフロールをベースに、lein-droid等のビルドツールの一覧も用意する。これらはライセンスに含める必要はないが「利用したツール」として出したい為
    • licenseページの英語化
  • 内の「:aot :all-with-unused」設定の見直し
    • :all-with-unusedだと、clojure.replとかまで入ってしまう、「:aot [:all ’neko.compilation]」みたいな感じの設定にしたい。しかし今のleinだとそういう設定はできないのでちょっと考える必要がある
  • ログ表示関数、ロゴ表示関数もConfig.javaにて設定できるようにする

  • enable proguard.cfg ( remove -dontshrink and tune-up )
  • collecting and documentation to know-how in clojure(for android), libgdx, android, neko


  • translate from japanese comment to english in source

  • report to libgdx community

  • change CLAN logo to more better

Help me

  • If you found mistaken contents or wrong english on this document, please report to (can write both english and japanese).
  • I(ayamada, developer of CLAN) have only short time for develop to CLAN.
    • Please give me pull-req.
      • Especially, Java developer for (but comments are written in japanese in source now, sorry…)
  • I have no money.
    • Please give me a work for money.
    • Please donate me a money for develop to CLAN.
  • Contact for me (provisional): @rnkv

  • この文書の内容や英文にミス等がありましたら、 にて指摘していただけると助かります(日本語でok)。
  • 山田(CLAN開発者)はあまりCLAN自体の開発に時間を費せません。
    • よかったら pull-req おねがいします。
      • 特にJavaの得意な人。BootLoader.javaまわりは非常に改善の余地があります
  • 山田は資金がありません。
    • よかったら金になるお仕事ください。
    • よかったらCLAN開発資金を寄付してください。
  • libgdxは日本語ドキュメントが猛烈に不足しているので、あなたも自分のサイトでlibgdxの日本語記事を書いてみませんか?
    • 山田が書いた雑多な記事は、clan/libgdxにあります。
  • 山田はやる気がありません。
    • 「やる気」はこの世で最も貴重なものの内の一つであり、その源となるようなものがあったら是非ください(例えば、面白いurl等)
  • 山田に連絡する場合はとりあえず @rnkv あたりにください。



CLAN have Apache License 2.0.

Which can be found in the file LICENSE.

(なお、CLANのライセンスは上記の通りですが、CLAN生成物のライセンスがどうなるかについては、 clan/license にメモがあります。日本語のみ。)

provided by 技情研ネット.