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

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

Mavenプラグイン調査

maven-source-plugin

概要

Maven centralにアップされていないライブラリに対して、ソースを紐付けることができるプラグイン

  1. 具体的には、xxx-source.jarを作成し、ローカルリポジトリ(.m2配下)に登録。
  2. maven eclipse pluginを使って、Eclipseの.projectファイルを生成させた際に、ライブラリに対してソースを紐付ける

設定方法

pom.xmlに、maven pluginの設定追加を行います。
Maven3系かつ、JDK7以上である必要があります。

pom.xml

  <build>
      <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
            <execution>
                <id>attach-sources</id>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
       </plugin>
     </plugins>
  </build>

pluginをインストールし、ソース・ファイルが生成される状態とし、同時にxxx-source.jarもローカルリポジトリに登録します。

mvn install

maven eclipse pluginを利用して、Eclipseの.projectファイルを生成した際に、ライブラリとソースを紐付けます。

mvn -DdownloadSources eclipse:eclipse

Maven設定(Javaバージョン指定、複数プロジェクト管理)

Maven設定は、ライブラリの依存関係追加ぐらいしか、触ることがなかったが必要が
設定構成がイマイチなプロジェクトを見直す必要が出てきたので、よくわかっていなかった設定について
いくつかまとめてみます。

環境

  • Java 1.6と1.8が混在
  • Maven 3.6.1
  • Eclipse 4.8 Photon
  • 複数プロジェクトが存在し、依存関係あり

1. Javaバージョン指定方法

Mavenコンパイル時や実行時のJavaバージョンの指定が可能です。
Mavenで指定すると、Eclipse側のビルドパスよりも設定が優先されます。

Javaバージョンの指定は、JAVA_HOMEバージョンとmaven-compiler-pluginで指定するJavaバージョンは合わせる必要があります。
もし、異なる場合は、JAVA_HOME指定バージョンの方が新しい状態にしておく必要がありそうです。

pom.xml pluginタグで指定

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.8</source>
      <target>1.8</target>
    </configuration>
  </plugin>
<plugins>

Maven3系であれば、maven-compiler-pluginのプロパティーで以下のように指定することもできます。

pom.xml propertiesタグで指定

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>

Spring Bootで指定する場合は、以下になります。

pom.xml Spring Bootにおいて、propertiesタグで指定

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <failOnMissingWebXml>false</failOnMissingWebXml> <!-- web.xml省略時に出る警告を消す -->
</properties>

2. マルチモジュール・プロジェクトを管理する

互いに依存関係のあるプロジェクトを順番にビルドしてビルドモジュールを作成したい場合があります。
この時、自動ビルドでは予期した順にビルドされず、ビルドに失敗してしまいます。

この場合は、packagingをpomにしたビルド専用プロジェクトを用意することで、
意図した順序でビルドを実行できます。

test_webプロジェクトがtest_dbプロジェクトに依存している際に、test_db → test_webの順で
ビルドするようにpom.xmlに以下のように設定します。

pom.xml (test_pomプロジェクト)

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test_pom</groupId>
  <artifactId>test_pom</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>../test_db</module>
    <module>../test_web</module>
  </modules>
</project>

pom.xml (test_dbプロジェクト)

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test_db</groupId>
  <artifactId>test_db</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <parent>
    <groupId>test_pom</groupId>
    <artifactId>test_pom</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
</project>

pom.xml (test_webプロジェクト)

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test_web</groupId>
  <artifactId>test_web</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  ...
  <dependencies>
   ...
   <dependency>
     <groupId>test_db</groupId>
     <artifactId>test_db</artifactId>
     <version>1.0.0-SNAPSHOT</version>
   </dependency>
   ...
  </dependencies>
  ...

  <parent>
    <groupId>test_pom</groupId>
    <artifactId>test_pom</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
</project>

Vagrantコマンド一覧

下記から使うものだけ、ピックアップして記載させて頂きました。 https://qiita.com/oreo3@github/items/4054a4120ccc249676d9

仮想マシンの操作

vagrant upで、boxから生成したイメージで仮想環境を起動します。
vagrant destroyで生成イメージを破棄。box自体は残ります。
削除する場合は、Box操作コマンドで削除します。

コマンド 説明
vagrant up 仮想マシンの起動。vagrantfileのあるディレクトリ内で実行
vagrant halt 仮想マシンの終了(シャットダウン)
vagrant suspend 仮想マシンの一時停止
vagrant reload ≒ halt & up
vagrant provision 仮想マシンは起動したままプロビジョニングのみ再度実行
vagrant destroy 仮想マシンの削除(boxは消えない)
vagrant status 仮想マシンのステータスを表示
vagrant global-status 仮想マシンの一覧(名前、ステータス、パス)
vagrant ssh 仮想マシンにログイン

Box操作

Boxは、イメージファイルを仮想環境に登録したもの。イメージの雛形。
vagrant packageで作成したboxで読み込むには、boxを追加する必要があります。
vagrant destroy破棄して、vagrant upすると前に追加したbox(デフォルト)が読み込まれることになります。

コマンド 説明
vagrant box list boxの一覧を表示
vagrant box add / boxの追加。ローカルのbox、URLから取得から取得
vagrant box remove / boxの削除
vagrant package box名 現在の仮想マシンをboxに。box名省略なら元のbox名 → これを元に vagrant box add box名 だけで同じ環境を構築できる

Snapshot操作

vagrant packageでのbox作成は時間がかかるため、環境作成で失敗したくない場合、Snapshotを作ることで 簡易的な一時バックアップを作成することができます。

コマンド 説明
vagrant snapshot save <スナップショット名> スナップショット作成
vagrant snapshot save <スナップショット名> [オプション] --provision 付けると強制的にプロビジョニング、--no-provision 付けると強制的にプロビジョニングさせない
vagrant snapshot restore <スナップショット名> スナップショット復元。--[no-]provisionはsaveと同じ
vagrant snapshot delete <スナップショット名> スナップショットの削除
vagrant snapshot list 名前付きスナップショットの一覧を表示

Vagrantコマンドのイメージ図

以下のサイトはコマンドのイメージが掴めます。
Vagrantコマンド一覧とかチートシートとか

ハッシュ化とは?

ハッシュ化は、システム内ではよく使われる処理ですが、
結局どういうものなのってところが説明できなかったので、少しまとめてみます。

概要

  • 固定長のランダムな値に変換すること
  • 暗号化とは異なり、不可逆な変換で、平文に戻すのは極めて困難
  • 同じ文字列であれば、同一のハッシュ値を生成することが可能
  • ファイル内容や長さ、ファイル名に関わらず短い固定長の文字列を生成できる

用途

  • ファイル改ざんチェック
  • パスワードのDB管理

ハッシュ化アルゴリズム

  • md5 (32桁) 攻撃性されることない範囲での同一性チェックには最適
  • SHA-1 (40桁) やや脆弱
  • SHA-2(SHA-256,SHA-512) (64桁、128桁) セキュリティ性は十分に高い
  • SHA-3 (64桁、128桁)
  • CRC32 (8桁) セキュリティ性は皆無。改ざんチェックやパスワードハッシュに使ってはいけない

生成ハッシュ値の桁数が少ないアルゴリズムでは、高いセキュリティを担保できないが、
セキュリティが求められない場合は、桁数が短いものを選んでも良い。
短すぎると重複してしまう可能性はあるので、その点は注意。

ハッシュ値生成ツール

実際にハッシュ値ってどんな値になるのかを確認したい場合は、以下で試してみるとわかりやすい。

SHA2/SHA1/MD5ハッシュ生成(Hash Generator)
https://tool-taro.com/hash/

UUIDとは?

128ビット(16バイト)からなる一意な識別子
バージョン番号などに6ビット、識別情報は122ビットを用います。

文字表記

XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
8桁-4桁-4桁-12桁に区切ってハイフンを挟んで記載

バージョン

V1:MACアドレスなどに用いる
V3,V5:ハッシュ値
V4:122ビットのランダムな値を生成して識別子とする

いまさらだけど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は、アペンダーでの出力文字コード