mike-neckのブログ

Java or Groovy or Swift or Golang

あまり必要ないけど、IntelliJ IDEA - Gradle - glassfish プロジェクトのテンプレート作った

表記の通りです。

JavaEEの本を読もうとしたら、プロジェクトを何度も作らなくてはいけなくて、前回のような作業を何度も繰り返すの面倒になったので、作った。

github.com

あとはgit cloneしてgradle rmDummyして、build.gradlesettings.gradleに書かれている__APP_NAME__をアプリケーションの名前に変えてgradle ideaすればIntelliJ IDEAでglassfish用のアプリケーションが簡単に作れる。

【2015/03/20 14:17 追記】 アプリケーション名とGradleプロジェクトの名前を動的にディレクトリー名から取得するように修正したので次のステップでプロジェクトを作れる。

  1. git cloneする
  2. gradle rmDummyタスクを走らせる
  3. gradle ideaタスクを走らせる

ちなみに、僕のマシンではこのテンプレートは次のような構造のtemplateというディレクトリーにある。そしてその上のディレクトリーでgroovyclient create.groovy app-nameすればもっと簡単にテンプレートの複製ができるようになっている。

glass-fish-projects
  ├ create.groovy ← groovyスクリプト
  └ template  ← 上記のレポジトリーの内容

create.groovyの内容は次のとおり

import java.nio.file.*

import static java.nio.file.FileVisitResult.*

if (args.length != 1) {
    def msg = $/usage
    groovy(client) create.groovy app-name
/$
    println msg
    System.exit(1)
}

def appName = '__APP_NAME__'

def path = Paths.get('template')
def dist = Paths.get(args[0])
def name = args[0]

def canCopyDir = {dir ->
    def p = dir.toString()
    ['.git', '.gradle', '.class', 'buildSrc/build'].findAll {
        p.contains(it)
    }.size() == 0
}

def canCopyFile = {file ->
    if(file.endsWith('build.gradle') || file.endsWith('settings.gradle')) return true
    def p = file.toString()
    ['.git', '.gradle', '.class', 'dummy', 'buildSrc/build'].findAll {
        p.contains(it)
    }.size() == 0
}

def visitor = [
    postVisitDirectory: {dir, e ->
        if(e != null) throw e
        CONTINUE
    },
    preVisitDirectory: {dir, attrs ->
        if(canCopyDir(dir)) {
            def p = path.relativize(dir)
            def d = dist.resolve(p)
            println "D: ${dir} -> ${d}"
            Files.createDirectories(d)
        }
        CONTINUE
    },
    visitFile: {file, attrs ->
        if(canCopyFile(file)) {
            def p = path.relativize(file)
            def f = dist.resolve(p)
            println "F: ${file} -> ${f}"
            def contents = file.toFile().text.replace(appName, name)
            f.toFile().write(contents, 'UTF-8')
        }
        CONTINUE
    },
    visitFileFailed: {file, e ->
        throw e
    }
] as FileVisitor

Files.walkFileTree(path, visitor)

println 'finished'