JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■SpringMVC の小径 第1歩 Eclipseのプロジェクト
1-3)pom.xmlの編集
なんか前置きばっかで、さっぱりSpring-MVCの話が出てこないじゃないか!(○`ε´○)
と、そろそろ怒りが込み上げてきた人もいるかもしれませんが、
まぁ、まぁ、そう慌てなさんな。あともうちょっとです。

ここからは、Mavenプロジェクトの心臓とも言える、pom.xmlの話をしましょう。
pom(Project Object Model)とは、いったい何ぞ??
また、訳のわからない単語が出てきました。 石ころばっかで歩きにくいったらありゃしない(笑)

1-1)Mavenプロジェクトの生成」で少し話しましたが、
Mavenさんが、雲の上の楽園に必要なプラグインを探しに行くための、飛行機の往復チケットだと思ってください。
具体的な詳細は、この節の最後の方で詳しく話しますが、とりあえず
Eclipseの「ナビゲーター」ビューの、jLaboプロジェクトのリストの下の方に、pom.xml というファイルが見えるはずです。
このファイルを選択し、マウス右ボタンクリックでメニューが表示されます。
「次で開く」-「Face構成エディター」を選択すると、Eclipseのエディットビューにpom.xmlが表示されるはずです。
「Face構成エディター」が見当たらない人は、「XMLエディター」とか「Maven POMエディタ」とかでも
行こうと思えば行けますが、かなり慣れが必要で、私は全く使う気になれません。
「Face構成エディター」の追加方法は、 「■Eclipse の小径 2-2)Eclipseの動作環境設定」の最後の方に紹介しているので
知りたい人は、一度回れ右して探してきてください。
pom.xmlを開く

 

Eclipseエディットビューに、pom.xmlの初期内容が表示されました。
この状態は、「1-1)Mavenプロジェクトの生成」で、プロジェクトを新規作成した際に入力した値が表示されおり
それ以外は、まだ何も登録されていません。
これを、自分に合った(必要な)プラグインを取得するために編集していきます。
pom.xmlの編集

 

一つ一つ説明するのが面倒なので、このjLaboプロジェクトで実際に使うpom.xmlの生ファイルを下にご紹介しておきます。
コピペして使ってもらっても何ら問題はありません。(ただし、使うばやいは、行番号は外してね!)

 

pom.xmlの具体的な書き方について少し解説しておきます。

上の、pom.xmlで言うと、
10行目までは、プロジェクト作成時初期値のまま変更はありません。
11行目から36行目の、<build></build>のブロックは必須ではないので、最悪無くても構いません(今のところ気休め程度)
ただし、最終的に公開サーバーにリリースする際に、サーバー上でリリース物をビルドする際には
重要なファクターとなるので、この通りに記述しておいた方が良いでしょう。
38行目から48行目の、<properties></properties>のブロックは、
      下の<dependency>で使う各プラグインのバージョン指定を、
      ここにまとめただけなので必須ではありません。(お好みでどうぞ)
50行目以降の<dependencies></dependencies>で囲まれたブロックが最も重要な部分です。
Mavenリポジトリから検索したいプラグインのプロパティを、
<dependency></dependency>ブロックで囲んで必要なだけ追加してゆきます。
今回は、Spring-MVCと、Thymeleafと、MyBatisがメインなのでそのあたりに重心を置いて、
あと周辺で必要なプラグインを定義しています。
<dependency></dependency>の中の書き方ですが、
これには決まったルールがあり、適当に書いてもMavenはダウンロードしてくれません。
書き方は、ネットを検索すればいろいろ紹介されていますが、自分が欲しいバージョンじゃなかったりと
帯に短し、痒いところに手が届かないもどかしさがあるので、雲の上の楽園を直接覗いてみましょう。
えっ?覗けるの? はい。もちろん覗けますとも!

ちょっと脇道にそれますが、まぁそんなに急ぐ旅でもないので余興として聞いてください。
ブラウザで、Maven Repositoryのサイトを開きます。

自分が欲しいプラグインを検索BOXに入力します。今回サンプルとして 「spring-mvc」としてみます。
Maven Repository検索

 

キーワードに関連したプラグインの検索結果の一覧が表示されます。
今、自分が欲しいプラグインは、Spring-MVC なので、「Spring Web MVC」のリンクをクリックします。
Maven Repository検索結果

 

指定したプラグインのバージョン一覧が表示されます。
2016年3月時点での最新版「4.2.5.RELEASE」のリンクをクリックします。
※)2016/Jul Spring-MVCのバージョンを、4.3.1 にバージョンアップしました。
Spring-MVC version

 

指定したプラグインの情報が表示されます。
よく見ると、画面の下ほどに、<dependency></dependency>で囲まれた文字列が見えます。
実はこれこそが、pom.xmlに定義するための文字列なので、
ここをそのままコピーして、pom.xml にペーストすれば大丈夫です。
Spring-MVC dependency

 

と、ここで頭のいい人はすでに気が付いていると思いますが、
Maven Repositoryが直接参照できて、プラグインの検索もできて、プラグインが直接ダウンロードできるのなら
何もわざわざ、pom.xmlに記述するような事せずに、直接ダウンロードすればいいんじゃね?
と考えてもおかしくはありませんね。確かに一理あります。
でも、残念ながらこれでは真理には辿りつけません。
上で紹介している実際の pom.xml をよく見ると、何カ所か、水色の文字でコメントアウトされてるブロックがあります。
例を挙げると、89行目から108行目のSpring関連が、spring-webmvcプラグインを除いてコメントアウト(無効化)されています。
実は、Spring-MVCを動かすためには、これ以外にも、spring-coreという Springの一番コアとなるプラグインが必要なのですが、
ここでは、定義すらされていません。 これでほんとに動くのでしょうか?

勘のいい人ならもうすでにお分かりでしょう。
その通りです。Mavenさんは、pom.xmlに書かれているプラグインを探すときに、
そのプラグインが依存している、別の下位のプラグインまで自動的に探し出してくれるのです。
Maven形式ではないプロジェクトの場合は、当然Spring-MVCに必要なすべてのプラグインを自分で調べて
ネット上に散らばったプラグインを探してダウンロードしなければならず。非常に骨の折れる作業です。
今回、jLaboプロジェクトを、Maven形式のプロジェクトで作成した必然的理由はまさにこの点にあります。

前にも書きましたが、pom.xmlは再利用可能なので、最初は色々苦労するかもしれませんが
一度作ってしまえば、次からはそれをベースにして、プラグインをちょこっと追加したりして拡張できるので
二回目以降のプロジェクトからは、ほとんど労力がかからなくなります。

Mavenさんの凄さ、少しはわかっていただけたでしょうか?

 

はい。ちょっと道をそれてしまいましたが、またEclipseに戻ってきました。
pom.xmlの編集はきちんと完了しましたが、よく見ると「問題ビュー」で何か問題が発生しています。
pom.xmlを勝手に修正したので、どうやらMavenさんが何か文句つけてるようです。
pom.xmlの問題

 

この場合は、「ナビゲーター」ビューのプロジェクト名を選択し、マウス右ボタンクリックしてください。
長いメニューが表示されますので、「Maven」-「プロジェクトの更新」を選択してください。
Mavenプロジェクトの更新

 

「Mavenプロジェクトの更新」画面が開くので、対象のプロジェクト名のチェックボックスをチェックして
「OK」ボタンをクリックします。
Mavenプロジェクトの更新

 

「問題ビュー」のエラーが消えて、Mavenさんのご機嫌も直ったようなので、
これでpom.xmlの編集は一旦完了です。
Mavenプロジェクトの更新完了

 

ところで余談ですが、Mavenさんが頑張って探してきてくれた様々なプラグインは一体どこに行ったのでしょう?
Eclipseの「ナビゲータ」を探してもそれらしいものがどこにも見つかりませんが、、
実は、ダウンロードされたプラグインはEclipseのワークスペース配下ではなく、
C:¥Users¥ユーザー名¥.m2¥repository という別のフォルダに格納されます。
このため、Eclipseのワークスペース間でもプラグインリソースを共有することができて無駄がありません。
興味があったら、このフォルダの下を確認してみてください。
きっと、ごっそりと山ほどの宝物が隠れているはずですから。

 

足の踏み場が悪い道を一気に駆け足で過ぎたので、ちょっと疲れましたね。
Spring-MVCの具体的なプログラムに入る前に、少し息抜きしましょう。
次は、EclipseでTomcatサーバーを起動し、ローカルPC上でWebを動かす方法を解説します。

 

※)2018/Jun/04 JDK-10移行
JDK-10に移行するにあたり、ちょっとはまってしまったので、
備忘録として残しておきます。
Linux上の、実行環境は単純に、Javaのパスを切り替えるだけですんなりと動いたものの、
いざ、Maven pom.xml を使ってLinuxでビルドしようとしたところ、
いくつかビルドエラーが出てビルドが異常終了します。
(※Eclipse上では特に異常は出ないのですが。。。)
調べたところ、JDK-10では、どうもpom.xmlの書き方が微妙に異なっているようです。
上の、pom.xml の17行目から25行目を次のように修正します。
 <!-- コンパイル -->
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>3.0</version>
 <configuration>
  <encoding>UTF-8</encoding>
  <!-- javaビルド時のjavaバージョンを指定する -->
  <source>10</source>
  <target>10</target>
  <!-- Java10からはこれが無いとbuildでエラーとなる -->
  <webXml<WebContent/WEB-INF/web.xml</webXml<
 </configuration>
以上で、pom.xmlのビルドエラーはとりあえず回避できました。

 

※)2020/Jan/23 Maven Central Repositoryの罠
Maven Central Repositoryを覗いていたら
Spring Frameworkがバージョンアップしていたので
早速、pom.xml を修正して、アップデートしようとしたところ
Linuxサーバー側のビルドで

[artifact:mvn] Downloading: http://repo1.maven.org/maven2/.....
  :
  :
[artifact:mvn] [INFO]
[artifact:mvn] [ERROR] BUILD ERROR
[artifact:mvn] [INFO]
的なエラーが出て、ビルドできなくなってしまった。

はて?
Eclipseでは問題ないのになぜじゃ??

あちこちネットを検索してみたら
こんな記事を見つけた。
https://qiita.com/seaweeds/items/45b026293a38f6001d6f

どうやら、2020年1月15日 から Maven の Central Repository URL が
httpから、https に変更になり httpではアクセスできなくなってしまった模様。
pom.xmlのデフォルトでは、残念なことに http を見に行くので、
プラグインがダウンロードできずにエラーになってしまう。

TECHSCORE(テックスコア)さんの記事
【3.3. リモートリポジトリの設定方法】
を参考に、pom.xml のMaven Central RepositoryへのURLを以下のように追加修正。

<repositories>
  <repository>
    <id>central</id>
    <!-- ここを https:// にする-->
    <url>https://repo1.maven.org/maven2/</url>
    <releases>
      <enabled>true</enabled>
    </releases>
  </repository>
</repositories>
<pluginRepositories>
  <pluginRepository>
    <id>central</id>
    <!-- ここを https:// にする-->
    <url>https://repo1.maven.org/maven2/</url>
    <releases>
      <enabled>true</enabled>
    </releases>
  </pluginRepository>
</pluginRepositories>

<repositories>ブロックと、<pluginRepositories>ブロックを追加して、urlをhttpsにする。

これで、無事アップデート終了。
めでたしめでたし。