しおしお

IntelliJ IDEAのことなんかを書いてます

IntelliJ小ネタ:Compact Empty Middle Packagesでも好きなパッケージ配下にファイルを作る!

IntelliJさんの、Project Viewでパッケージの表示状態をCompact Empty Middle packagesな状態にしていると、間のパッケージにファイルを作成することができません。

例えば、下の画像の状態でdomaパッケージを選択してファイルを作ると、domaの下に作られます。
f:id:sioiri:20160804225540p:plain

これを、siosio配下に作るかdoma配下に作るかを選択できるようにする方法です。

Registry画面を開く

Find ActionからRegistry画面を開きます。
f:id:sioiri:20160804225802p:plain

設定を変更する

「projectView.choose.directory.on.compacted.middle.packages」のチェックをオンにすることで、作成するパッケージを選択できるようになります。

f:id:sioiri:20160804230626p:plain

ファイルを作ってみると

どこに作るか聞いてくれます。いい感じです。
f:id:sioiri:20160804230110p:plain

おわり。

Spring Bootでjackson-module-kotlinを使う

Jacksonのkotlin対応モジュール をSpring Bootで使ってみる。

バージョンなど

Spring Boot:1.3.5
Jackson:2.6.6

Jacksonのkotlinモジュールを依存に追加

Gradleだとこんな感じですね

compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.6.6'

Jsonマッピングするクラス

こんな感じのクラスにマッピングする

data class Param(val str:String, val num:Int)

JacksonのKotlinモジュールを有効にする

Developing Spring Boot applications with Kotlinを参考にして追加してあげる。

  @Bean
  open fun objectMapperBuilder(): Jackson2ObjectMapperBuilder
      = Jackson2ObjectMapperBuilder().modulesToInstall(KotlinModule())

コントローラの実装

Jsonマッピングされたdata classを文字列表現で返すだけのシンプルな実装です。

@RestController
@RequestMapping("test")
open class Controller {

  @RequestMapping(consumes = arrayOf(MediaType.APPLICATION_JSON_VALUE), method = arrayOf(RequestMethod.POST))
  @ResponseBody
  fun post(@RequestBody param: Param): String {
    return param.toString()
  }
}

動かしてみると

いい感じに動きました。

curl  -H "Content-Type: application/json" -X POST -d '{"str": "12345", "num": 100}' http://localhost:8080/test
Param(str=12345, num=100)

Spring Boot1.4系になると

Spring Boot1.4系になると、 jackson-module-kotlinを追加してあげるだけでいい感じに動いてくれます。
上の例で書いたような、KotlinModuleの設定がいらなくなる感じです。

この辺の実装が追加されてるからですかね。
spring-framework/Jackson2ObjectMapperBuilder.java at master · spring-projects/spring-framework · GitHub

おわり。

IntelliJさん標準で背景画像が設定できるようになってた

IntelliJさんの最新のEAP(build no:162.646.4)にしてみたら、
標準機能でIDEの背景画像設定できるようになってたので試してみた。

背景画像を設定する画面を開く

Find Actionから「Set Background Image」を検索して、設定画面を開きます。

下の画像の設定画面が開かれるので、お好きな画像を設定します。
f:id:sioiri:20160602114411j:plain



オプションは試してないのでよくわかりません。

背景画像が設定された!

こんな感じになります。

f:id:sioiri:20160602094103p:plain

おわり。

JBeretでジョブ定義をロジックで構築して実行する

JBeretでは、ロジックでジョブ定義を構築することが出来るみたいなので試してみた。
これを使うと、xmlでジョブ定義をすることなくバッチを実行することができるようになる。
ただし、JSRで定められているわけではないので、バッチ実行時にJBeretを直接扱う必要がある。

ドキュメントはこちら→Programmatic Job Definition with Java | JBeret User Guide

ジョブ定義を構築する

JobBuilderやStepBuilderを使ってジョブ定義を構築していく感じになる。
batchletやreaderなんかに指定する名前は、xmlに定義する時と同じようにBeanの名称を設定する。

この例だと、sample-jobジョブに2つのステップがあって、batchlet-step -> chunk-stepの順に実行される。

val job = JobBuilder("sample-job")
    .step(
        StepBuilder("batchlet-step")
            .batchlet("sampleBatchlet")
            .next("chunk-step")
            .build()
    )
    .step(
        StepBuilder("chunk-step")
            .reader("sampleItemReader")
            .writer("sampleItemWriter")
            .itemCount(2)
            .build()
    )
    .build()

ジョブを実行する

ジョブを実行するには、BatchRuntimeから取得したJobOperatorをJBeretの実装(JobOperatorImpl)にダウンキャストしてあげる。
JobOperatorImplには、JobBuilderで構築したJobオブジェクトを指定してジョブを実行するメソッドが用意されているので、それを使ってジョブを実行してあげる。

val jobOperator = BatchRuntime.getJobOperator() as JobOperatorImpl
val executionId = jobOperator.start(job, null)

ソースは全体はこちら→GitHub

おわり。

Gradleで似たようなタスクをグループ化する

Gradleのグループ化機能を使うと同じ種類位のタスクをグループでまとめられるようになる。
IntelliJを使っている場合、Gradleウィンドウではグループ毎にタスクがまとめられて表示されるので、ビルドスクリプト側でグループ化しておくとIntelliJさんでもタスクが探しやすくなる感じです。

タスクをグループ化するには、タスクのgroupプロパティにグループ名を設定します。

この場合、run_batchletとrun_chunkのタスクがapplicationグループとなる。

task run_batchlet(type: JavaExec) {
  classpath = sourceSets.main.runtimeClasspath
  main = 'org.jberet.se.Main'
  args 'batchlet-next-element-sample'
}

task run_chunk(type: JavaExec) {
  classpath = sourceSets.main.runtimeClasspath
  main = 'org.jberet.se.Main'
  args 'chunk-next-element-sample'
}
[run_batchlet, run_chunk]*.group = 'application'

IntelliJさんのGradleウィンドウでの表示

applicationグループにまとまってますね。
f:id:sioiri:20160506075345p:plain

gradle tasksの結果

こちらも、ちゃんとグループにまとめられています。
ちなみにタスクの説明は、タスクのdescriptionプロパティに設定してあげると表示されるようになります。

Application tasks
-----------------
installApp - Installs the project as a JVM application along with libs and OS specific scripts.
run - Runs this project as a JVM application
run_batchlet
run_chunk

おわり。

sphinxからjavadocへのリンク簡単に貼れる拡張

Sphinxのドキュメントから、Javadocページ編のリンクを貼るのを簡単にするjavasphinx User’s Guide — javasphinx 0.9.8 documentationという拡張です。

この拡張を使うと、Javadocのトップページへのパスをconf.pyに設定して置けるので、
ここのページではクラスの完全修飾名を書くだけでよく割りと簡単にリンクが作成できます。

インストー

拡張のページに有るようにpipかeasy_installを使ってインストールします。

pip install javasphinx

easy_install -U javasphinx

javasphinx拡張を有効にする

拡張を使うためには、conf.pyのextensionsにこの拡張を追加する必要があります。

初期状態の場合、conf.pyに空の配列が設定されたextensionsがあるので以下のようにします。

extensions = ['javasphinx']

パッケージとJavadocページとのマッピング設定

この拡張機能は、パッケージ単位にJavadocのURLを設定します。
この設定は、conf.pyに対して行います。

例えば、spring(org.springframework)のJavadocページヘのマッピングは、以下のようになります。

javadoc_url_map = {
  'org.springframework' : ('http://docs.spring.io/spring-framework/docs/current/javadoc-api/', 'javadoc'),
}

リンクを書いてみる

SpringのRestTemplateへのリンクの場合、以下のように書きます。

:java:extdoc:`org.springframework.web.client.RestTemplate`

生成されたSphinxのドキュメントは、以下のようになります。
f:id:sioiri:20160403000039p:plain

リンクテキストを変えたい場合は、以下のように「リンクテキスト <クラスの完全修飾名>」とします。

:java:extdoc:`RestTemplate <org.springframework.web.client.RestTemplate>`

f:id:sioiri:20160403000219p:plain

メソッドへのリンクは、完全修飾名の後にドット(.)+メソッド名で書きます。
メソッドの引数も正確に書く必要があります。

* :java:extdoc:`String#toString <java.lang.String.toString()>`
* :java:extdoc:`String#replace <java.lang.String.replace(java.lang.CharSequence,%20java.lang.CharSequence)>`

生成されたSphinxのドキュメントは、以下のようになります。
f:id:sioiri:20160403001216p:plain

おわり。

IntelliJ IDEA16でMavenプロジェクトが開けない場合の対処方法

IntelliJ IDEAのバージョン16で、Mavenプロジェクトを開こううとした時に下のエラーが出た場合の対処方法。

com.intellij.execution.ExecutionException:
java.lang.UnsupportedClassVersionError: org/jetbrains/idea/maven/server/RemoteMavenServer : Unsupported major.minor version 52.0

原因

IntelliJ IDEA16からJava8でビルドさていているので、pomを開く時のJavaのバージョンも8にする必要があります。

pomを開くときにJava8でビルドされたMavenプロジェクトのAPIを呼び出しているのが原因なんだけど、
なんで対応してないバージョン普通に選べるのか謎な感じある。

対策

この手順で、pom開く際のjdkを変更する必要があります。

デフォルト設定画面を開く

Welcome画面から設定画面を開くとデフォルトの設定値を変更できるので、Welcome画面から設定画面を開く。
f:id:sioiri:20160223113310p:plain

MavenJDK for importerをJava8に変更する

画像のように変更する。
f:id:sioiri:20160223113311p:plain

おわり。