気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

いまさらだけどSastrutsのプロジェクトをMavenで導入する

背景

まだ、SAstrutsから移行できずにいるプロジェクトが残っており、
そのプロジェクトがビルドできない。きれいな空プロジェクトをMavenを使って作成して、
ビルドできる状態にしようと考え、空プロジェクトを生成してみる。

環境

Mac OSX High Sierra

Maven2系をインストールする

Homebrewでは2系が落とせないかったので、zipファイルよりインストールする。
ローカル環境はMaven3.5になっているが、このバージョンでは、Sastrutsのsa-struts-archetypeでプロジェクトを作成できない。

そこで、2系の最新モジュールを以下よりダウンロードする

https://archive.apache.org/dist/maven/binaries/apache-maven-2.2.1-bin.zip

ダウンロードファイルを解凍後、今回は所定のパスに配置。ディレクトリ名はmaven2.2.1とした。

mv /Users/user_name/Downloads/apache-maven-2.2.1 /usr/local/opt/maven2.2.1

zprofileのMavenパスを以下に変更。すでに設定済みだったので。

export PATH="/usr/local/opt/maven2.2.1/bin:$PATH"

パスを通したファイルの設定を読み込み、反映する。

source ~/.zprofile
mvn -v
% mvn -v                                                                                                     [23:23:58]
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
・
・
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x" version: "10.13.6" arch: "x86_64" Family: "mac"

Sastrutsの空プロジェクトを作成する

以下を参考にmvnコマンドを叩く。
http://sastruts.seasar.org/mavenArchetype.html

% mkdir sandbox_sastruts; cd sandbox_sastruts
% mvn archetype:generate -DarchetypeRepository=http://maven.seasar.org/maven2/ \                             [23:08:05]
    -DarchetypeGroupId=org.seasar.sastruts \
    -DarchetypeArtifactId=sa-struts-archetype -DarchetypeVersion=1.0.4-sp9.1 \
    -DgroupId=com.example -DartifactId=sample -Dversion=1.0

Eclipse用のプロジェクトに変更し、ビルドしてみる

$ mvn eclipse:eclipse
$ mvn package

Eclipseで起動しなくなった場合

以下引用。
困ったときは、リフレッシュ&クリーン!

  1. mvn eclipse:eclipse を実行
  2. (Eclipseに読み込んでいなければ) Eclipse にプロジェクトとして読み込み
  3. Eclipse 上でプロジェクトをリフレッシュ
  4. Eclipse 上でプロジェクトをクリーン・ビルド (自動ビルドにしておくとクリーンのみ)
  5. src/main/webapp/WEB-INF の lib と classes が生成されていることを確認
  6. Tomcat を起動

mvn clean や mvn package などを実行した場合は、再度 mvn eclipse:eclipse を実行してください。
それらの mvn コマンドを実行すると、Tomcat プラグインで起動して利用する上で必要な src/main/webapp/WEB-INF/lib が削除されます。

log4jの設定書き方

commons-loggingと合わせて使うlog4jの設定方法がわかっていなかったので、まとめてみます。

1. 設定概要

設定ファイル:log4j.properties
配置場所:クラスパスの通ったパス。resourcesなど

log4j.xmlへの設定もできるが、今回はプロパティファイルに設定する前提記載していきます。

設定 説明
appender ログの出力先、出力方法の設定。Console、File出力が可能で、複数の出力先へ出力可能
layout ログ出力形式の指定。日付、ログレベル、ログ出力先のクラス名などをappender毎の設定
category categoryは、ログ設定単位。パッケージまたは、クラス単位で出力レベルの設定が可能

2. 基本的な設定方法

一般的な設定方法は、以下の通り

# カテゴリ
log4j.rootCategory = INFO, A1
log4j.category.org.aaa.myApp = DEBUG, A1
# アペンダー
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target = System.out
# レイアウト
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %d{HH:mm:ss,SSS} %-5p %c - %m%n

カテゴリ

log4j.rootCategory= ログレベル,アペンダ名1,アペンダ名2,・・・
log4j.category.カテゴリ名 = ログレベル,アペンダ名1,アペンダ名2,・・・

rootCategoryが親の設定。categoryの設定が、子設定で親の設定を継承します。
カテゴリ名の箇所に、パッケージ名やクラス名を指定。

アペンダー

log4j.appender.アペンダ名 = アペンダクラス名
log4j.appender.アペンダ名.プロパティ名1 = 設定値
log4j.appender.アペンダ名.プロパティ名2 = 設定値

アペンダクラス名に以下のようなクラスを設定する。

アペンダークラス 機能
org.apache.log4j.ConsoleAppender コンソールへログ出力
org.apache.log4j.FileAppender ファイルへログ出力
org.apache.log4j.DailyRollingFileAppender ファイルへログ出力する。日次ログローテ

log4j.appender.A1.Targetで出力内容を指定。
指定は、標準出力(System.out)or 標準エラー出力(System.err)

レイアウト

log4j.appender.アペンダ名.layout = レイアウトクラス名
log4j.appender.アペンダ名.layout.ConversionPattern = レイアウトパターン

レイアウトクラス名で、org.apache.log4j.PatternLayoutを指定することでユーザがレイアウト指定可能になります。
指定は、レイアウトパターンの箇所に設定。

3. 階層構造とログ伝播

一般的な設定例の内容を再度記載します。

# カテゴリ
log4j.rootCategory = INFO, A1
log4j.category.org.aaa.myApp = DEBUG, A1
# アペンダー
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target = System.out
# レイアウト
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %d{HH:mm:ss,SSS} %-5p %c - %m%n

rootCategoryが親、categoryがその子という階層ですが、
ロガーでは、子のアペンダーで設定したログ出力条件は、伝播するという仕組みを持っています。

そのため、アペンダーA1で設定した標準出力内容をコンソールに出力するという設定は、 org.aaa.myAppより上の階層でも適用されます。 これを回避したい場合は、以下の設定を追加します。

# カテゴリ
log4j.rootCategory = INFO, A1
log4j.category.org.aaa.myApp = DEBUG, A1
log4j.additivity.org.aaa.myApp = false # ← 追加
・
・

こうすると上の階層にA1アペンダーのログ設定は反映されません。 もちろん、上位で設定しているアペンダーがあればその設定は、有効です。

4. 押さえておきたい設定

設定可能な便利なオプションは多数ありますが、2つだけ共有しておきます。

log4j.appender.名前=org.apache.log4j.SomeAppender
log4j.appender.名前.Threshold=INFO
log4j.appender.名前.encoding=UTF-8

Thresholdは、アペンダー単位のログレベルの指定。
標準出力はINFO、ファイル出力は、ERRORレベルまでを出力可能とするなどの設定が可能となる。
encodingは、アペンダーでの出力文字コード

意外と知らないEclipseコード補完で使えるテンプレート

テンプレートを使った補完って便利ですよね。
あまり使っていなかったけど、便利なテンプレートを紹介してみます。

また、よく書く記述はテンプレート化して、入力量と記述ミスを減らしていくと無用なデバッグが減って 仕様確認、設計など大事なことに時間を使えます。

既存テンプレート

「toarray」なら、toaなどと入力して、コード補完のコマンドを叩くと、toarrayが候補に現れ、選択できます。 入力すると、$内にカーソルがあたり、入力できるようになります。

ちなみにソースはテンプレート内のコードです。

toarray

(${type:elemType(collection)}[]) ${collection}.toArray(new ${type}[${collection}.size()])

sysout

System.out.println(${word_selection}${});${cursor}

switch

switch (${key}) {
    case ${value}:
        ${cursor}
        break;

    default:
        break;
}

try_catch

try {
    ${line_selection}${cursor}
} catch (${Exception} ${exception_variable_name}) {
    // ${todo}: handle exception
}

Eclipse開発環境を便利にする4つの設定

開発作業の効率化のために、Eclipseでやっておくと便利な設定を以下に記載しておきます。

※以前はてな記法で記載したものが見辛かったのでMark down形式で書き直しておきます。

Eclipseのテンプレート機能

sublime textで便利だと思っていたコードスニペットに似た機能がeclipseにもあり、自分好みにカスタマイズしたくなりました。

http://www.atmarkit.co.jp/fjava/javatips/056eclipse020.html
→forと入力時にCtrl + Spaceと入力すると表示されるテンプレートを自作する方法
→作成したものはエクスポートしておき共有するとチームに喜ばれるます。

自動補完トリガー設定

[Java]-[エディター]-[コンテンツ・アシスト]のメニューを開きます。

自動有効化の欄のJavaJavadocに以下の文字を設定します。
Java:「.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Javadoc:「@#<.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

上記設定で、設定文字列入力タイミングで補完候補が表示され、入力負担を軽減できます。

static インポートを展開しない

・import static org.junit.Assert. を展開しないようにする設定
[Java]-[コードスタイル]-[インポートの編成] の .
に必要な静的インポート数 を 1 にする

入力文字が最大幅で折り返されるように設定

1.[Java]-[コードスタイル]-[フォーマッター]-[編集]
2.プロファイル名を変更
3.行の折り返しタブ→代入の設定→行の折り返しポリシーにおいて

「必要な場合は折り返す」

に設定する。

達人に学ぶSQL徹底指南書の振り返るための要点

以下を読了しました。定期的に振り返る際のインデックスになる情報を纏めます。 詳細なSQLや内容は本を読んで確認してみて下さい。

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS) https://amzn.to/2IwwYWj

1 CASE式

記述時の注意点

  • 各分岐が返すデータ型を統一する
  • ELSE、ENDは必ず書く。ELSEなしは、暗黙でELSE NULL

機能

  • CASE式の結果は値。SELECT、WHERE、GROUP BY句などどこでも記述できる
  • 値の張替え。条件に応じて値を変更し、振り分けられる。
  • SUMと組み合わせると特定条件レコードのカウントアップができる

※ 随時追記

Mavenで取得したJarのソースコードをEclipseにを添付する

Mavenで取得したJarのソースコードが参照できなかったので、 ソースコードのダウンロードを行う設定をMavenEclipseプラグインで設定しました。

pom.xmlへの設定

buildタグ内に「maven-eclipse-plugin」の設定を追記。

<build>
    ・
    ・
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-eclipse-plugin</artifactId>
      <configuration>
        <downloadSources>true</downloadSources>
        <downloadJavadocs>true</downloadJavadocs>
      </configuration>
    </plugin>
  </plugins>
</build>

プロジェクト右クリックで表示されるメニューの実行で「7 Maven ビルド]
を選択し、Mavenビルドの実行構成を開く。

ゴールに以下の設定を追加。eclipseプロジェクトに変更するコマンドですが、
この際にpomにおける「downloadSources」の設定を適用し、ソースコードをダウンロードします。

eclipse:eclipse

f:id:tamata78:20190623111423p:plain

ただ、これだけでは、ソースコードをダウンロードしただけなので、以下を行います。

jarのソースを開く、ソース添付でsourceのjarを添付。
jar内のソースも参照できるようになる。

見たかったopen csvのソースがやっと見れるようになりました。

f:id:tamata78:20190623111507p:plain

TomcatのCatalinaってなんだろう

Tomcatインストールディレクトリ内にCatalinaという用語はいくつか出てくるが
その意味について少し整理しておく。

Catalinaとは

サーブレットコンテナ。
Tomcat自体も広義ではサーブレットコンテナらしいが、
紛らわしいので、Webコンテナと呼ばれているらしい。

CATALINA_HOME

Tomcatのインストールディレクトリ。
昔は、TOMCAT_HOMEだったよう。同じサーブレットコンテナだったから?

CATALINA_HOMEとCATALINA_BASE

CATALINA_BASEは、基本CATALINA_HOMEと同じパスが設定される。
別パスを設定するとこでエンジン部分(CATALINA_HOME)とデータ部分(CATALINA_BASE)を分けられるらしい。

CATALINA_HOME/conf/Catalina/localhost

CATALINA_HOME/conf/Catalina/localhostは、
context.xml(アプリケーション登録情報)が配置されるディレクトリです。
eclipseでサーバー追加(アプリデプロイ設定)をするとcontext.xmlが生成されます。

ここでのCatalinaのディレクトリは、サーブレットコンテナの設定ファイルを格納しているとの意味で命名されていると思われる。

context.xml

<Context path="/hello"
docBase="c:/sampleApp/helloworld"/>

Tomcatについて理解を深めたい方は、以下の記事もあります。Tomcatディレクトリ構成とその意味など書いています。
tamata78.hatenablog.com

Tomcatに関連して、WebサーバーのApacheについて
tamata78.hatenablog.com