(O+P)ut

アウトプット



(O+P)ut

Output Log

【入門】Mavenコマンドでプロジェクトを作成する

はじめに

Apache MavenとはJava用のプロジェクト管理ツールですが、EclipseやVSCodeにてGUI上で利用できるので直接コマンドを叩かなくても利用可能です。
ただし、本記事ではあえてmavenコマンドにてプロジェクトを作成した際の動きを解説します。

環境情報
  • Windows(Cygwin)

事前準備

mavenがインストールできている環境では以下のようなコマンドと隠しディレクトリがあります。

$ tree -a
.
├── .mvn
│   └── wrapper
│       ├── maven-wrapper.jar
│       ├── maven-wrapper.properties
│       └── MavenWrapperDownloader.java
└── mvnw

こちらをテスト用ディレクトリに配置することでmvnw(mvnコマンド)を利用していきます。

ちなみにmvnwコマンドだけを配置してコマンドを利用すると以下エラーとなります。

C:\cygwin64\home\xx\Maventest\.mvn\wrapper\maven-wrapper.jar: No such file or directory
エラー: メイン・クラス org.apache.maven.wrapper.MavenWrapperMain が見つからないか、ロードできません

プロジェクトを作成する

以下コマンドでプロジェクトが作成できます。

$ ./mvnw archetype:generate

以下のようにツラツラとメッセージが流れ

[INFO] Scanning for projects...
[INFO] Building Maven Stub Project (No POM) 1
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.
maven.archetypes:maven-archetype-quickstart:1.0)
...

以下のようにバージョンを選んだり

Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
...
Choose a number: 8: ...

グループID(≒パッケージ)やアーティファクトID(≒アプリケーション名)を選ぶと

Define value for property 'groupId': hoge
Define value for property 'artifactId': huga
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' hoge: :
...

以下メッセージが出た後にプロジェクトの作成に成功します。

BUILD SUCCESS

プロジェクトの構成を確認する

全体のファイル構成は以下です。

$ tree -a
.
├── .mvn
│   └── wrapper
│       ├── maven-wrapper.jar
│       ├── maven-wrapper.properties
│       └── MavenWrapperDownloader.java
├── mvnw
└── huga
    ├── pom.xml
    └── src
        ├── main
        │   └── java
        │       └── hoge
        │           └── App.java
        └── test
            └── java
                └── hoge
                    └── AppTest.java

Mavenプロジェクトを利用したことがある方は見たことのあるツリー構成だと思います。

srcディレクトリ配下でソースコードファイルを管理し、pom.xmlにてプロジェクトのビルドを行っていきます。

ちなみにmainのほかにできているtestディレクトリにてユニットテスト関連のコードを管理します。

終わりに

SpringBootにてmavenをビルドツールに採用することが多いので記事にしてみました。
一度コマンドベースでmavenを触っておけば、GUI上でビルドした際の動きの理解にも繋がるので環境がある方はぜひ遊んでみてください。

【SpringBoot】WASLibertyにwarファイルを配置して動作確認する

はじめに

Windows10&DockerDesktopを利用している環境にてSpringBootのwarファイルをLibertyにデプロイした流れを説明します。

以下記事のWindowsバージョンです。

環境情報
  • Windows 10
  • DockerDesktop
  • Eclipse(STS)

warファイルの準備

Eclipseでwarファイルを生成しました。スタータープロジェクトをMavenで作成しました。

└── demo
    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── example
    │   │   │           └── demo
    │   │   │               ├── DemoApplication.java
    │   │   │               ├── Hello.java
    │   │   │               └── ServletInitializer.java
    │   │   └── resources
    │   │       ├── application.properties
    │   │       ├── static
    │   │       └── templates
    │   └── test
    │       └── java
    │           └── com
    │               └── example
    │                   └── demo
    │                       └── DemoApplicationTests.java
    └── target
        ├── classes
        │   ├── application.properties
        │   └── com
        │       └── example
        │           └── demo
        │               ├── DemoApplication.class
        │               ├── Hello.class
        │               └── ServletInitializer.class
        ├── demo-0.0.1-SNAPSHOT
        │   ├── META-INF
        │   └── WEB-INF
        │       ├── classes
        │       │   ├── application.properties
        │       │   └── com
        │       │       └── example
        │       │           └── demo
        │       │               ├── DemoApplication.class
        │       │               ├── Hello.class
        │       │               └── ServletInitializer.class
        │       └── lib
        ├── generated-sources
        │   └── annotations
        ├── generated-test-sources
        │   └── test-annotations
        ├── maven-archiver
        │   └── pom.properties
        ├── maven-status
        │   └── maven-compiler-plugin
        │       ├── compile
        │       │   └── default-compile
        │       │       ├── createdFiles.lst
        │       │       └── inputFiles.lst
        │       └── testCompile
        │           └── default-testCompile
        │               ├── createdFiles.lst
        │               └── inputFiles.lst
        ├── surefire-reports
        │   ├── com.example.demo.DemoApplicationTests.txt
        │   └── TEST-com.example.demo.DemoApplicationTests.xml
        └── test-classes
            └── com
                └── example
                    └── demo
                        └── DemoApplicationTests.class

唯一作成したHello.javaは以下

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
public class Hello {

    @RequestMapping("hello")
    private String hello() {
        return "HelloWorld";
    }
}

この状態でpom.xmlにて右クリックし「maven install」を行えば以下のようにwarファイルが作成されます。

[INFO] Building war: C:\XX\demo\target\demo-0.0.1-SNAPSHOT.war

Libertyコンテナを起動する

「websphere-liberty」イメージを利用します。

ポイントは今回のwarファイルを「/config/dropins/」配下に配置することです。これによって自動デプロイされます。

以下はPowerShellのワンライナー。ポートは80をアクセスすればコンテナ内の9080に転送するようにしています。

> docker run -d -p 80:9080 -v C:\Users\XX\..\demo-0.0.1-SNAPSHOT.war:/config/dropins/app.war websphere-liberty

ちなみにコンテナ内に確認すると以下のプロセスが起動しています。

default@1f249f2fd45b:/$ ps x
  PID TTY      STAT   TIME COMMAND
    1 ?        SLsl   1:10 /opt/ibm/java/jre/bin/java -javaagent:/opt/ibm/wlp/bin/tools/ws-javaagent.jar -Djava.awt.head  .. bash

動作検証を行う

今回は「app.war」と名前を変えて配置したので「/hello」と合わせて以下のURLにアクセスすると確認できます。

$ curl http://localhost/app/hello
Hello World!

ブラウザに同URLを入れても同じ結果が確認できます。

app本体やapp配下の別のパスを入れても404でエラーとなり

$ curl http://localhost/app
Error 404:
$ curll http://localhost/app/a
Error 404:

そもそも別のパスを入れればLivertyのエラー画面になります。

$ curl http://localhost/hoge
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
...
content="WebSphere Application Server Version V8.5 Liberty Profile - Context Root Not Found" />
...

ちなみに

同warファイルをVisualStudioCodeで作成して配置すると以下エラーとなり詰まったので今回はEclipseを採用しました。

$ curl http://localhost/app/hello
Error 404: javax.servlet.ServletException: java.io.FileNotFoundException: SRVE0190E: File not found: /hello

終わりに

冒頭のリンク先では以下のようにwarファイルの配置をワンクッションおいてましたがDockerDesktopではそのまま配置できます。

ダウンロードしたサンプルアプリケーションを、PC 環境(例: /c/Users/shimizu/ci.docker.tutorials/app/ServletApp.war)から仮想マシン(default)(例: /tmp/ServletApp.war)にコピーします。

以上、ご参考になれば幸いです。

【Windows】Powershellでheadコマンド相当の処理を行う

やりたいこと

例えばUNIX環境では以下のようにheadコマンドで先頭行のみを抜き出せますが

$ docker ps -q
4aee89111efc
6f222648dbfa
5f0b36608a8e
$ docker ps -q | head -n 1
4aee89111efc

Windows(Powershell)では利用できません。

 head
head : 用語 'head' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません
。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくださ
い。

実現方法

コマンド全体を( )で囲い、後ろを[ ]で囲います。

> docker ps -q
4aee89111efc
6f222648dbfa
5f0b36608a8e
> (docker ps -q)[0..0]
4aee89111efc

以下、補足です。

補足

特徴的な表現ですが、慣れると結構便利です。
後ろに入れる数字は0が先頭を指し、数字を変更することで複数行を取ることも可能です。

> (docker ps -q)[1..1]
6f222648dbfa
> (docker ps -q)[0..1]
4aee89111efc
6f222648dbfa

この数字部分はマイナスにすることで下からさかのぼることも可能なのでtail相当の処理も行えます。

> docker ps -q
4aee89111efc
6f222648dbfa
5f0b36608a8e
> (docker ps -q)[-1..-1]
5f0b36608a8e
$(docker ps -q)[-1..-2]
5f0b36608a8e
6f222648dbfa

以上、ご参考になれば幸いです。

【Java】org.apache.maven.wrapper.MavenWrapperMainが見つからずビルドエラーになる

事象

MAVEN PROJECTのvalidateを以下コマンドで行うも

> "C:\XX\mvnw.cmd" validate -f "c:\XX\pom.xml"

以下のエラーが出る。

"2" 個の引数を指定して "DownloadFile" を呼び出し中に例外が発生しました: "WebClient 要求で例外が発生しました。"
発生場所 行:1 文字:282
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException
 
エラー: メイン・クラス org.apache.maven.wrapper.MavenWrapperMain が見つからないか、ロードできません

原因

Maven Wrapperがディレクトリ内に配置されていない

対応策

以下をプロジェクトディレクトリのルートに配置する。

.mvn/
└── wrapper
    ├── maven-wrapper.jar
    ├── maven-wrapper.properties
    └── MavenWrapperDownloader.java

以下、補足です。

補足

環境はVisualStudioCode+Springboot+Mavenです。

SpringBootのプログラムをvalidadeした際にタイトルのエラーが発生しました。
該当ディレクトリを確認したところ、mavenコマンドを始め関連ファイルがなかったので他のmavenプロジェクトから同ファイルを持ってきました。

配置後は同コマンドでビルドが成功しました。

[INFO] Scanning for projects...
[INFO] 
[INFO] ------< org.springframework:springboot-xx >-------
[INFO] Building springboot-xx 0.2.0
[INFO] ----------------------------------------------------
[INFO] BUILD SUCCESS

以上、ご参考になれば幸いです。

【VSCode】SpringBootのサンプルアプリをwarにする方法

やりたいこと

Mavenプロジェクトで管理しているSpringBootのアプリケーションをwar化する

環境情報
  • Visual Studio Code 1.42
  • Springboot 2.2.4.RELEASE

やり方

pom.xmlに以下文言を追記する。

<packaging>war</packaging>

以下、補足です。

補足

以下のサンプルアプリをwar化しました。

デフォルトのpom.xmlにてpackage化するとdemo-0.0.1-SNAPSHOT.jarというファイルがプロジェクトディレクトリから見て以下の場所に生成されます。

./demo/target/demo-0.0.1-SNAPSHOT.jar

よってpom.xmlで明示的に「war」を指定することで出力形式を変更します。

...
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo</name>
...

ちなみに発行されるコマンド自体はどちらも以下です。

PS C:\Users\XX\sptest\demo> & "c:\Users\XX\sptest\demo\mvnw.cmd" package -f "c:\Users\XX\sptest\demo\pom.xml"

以上、ご参考になれば幸いです。

【SpringBoot】Mavenプロジェクトをpackageする際にNoCompilerとエラーになる

事象

SpringBootにて作成したプロジェクトをパッケージ化しようとすると以下のエラーとなり失敗する。

[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
環境情報
  • Visual Studio Code 1.42
  • Springboot 2.2.4.RELEASE

原因

pom.xmlで指定いるJavaのバージョンと実際にコンパイルで利用しているJavaのバージョンが異なっている。

対応策

pom.xmlの以下箇所を

<properties>
	<java.version>1.XX</java.version>
</properties>

ターミナルから確認できるjavacのバージョンと合わせる

> javac -version
javac XX.Y.Z

以下、補足です。

補足

警告にて以下メッセージが上がっていたので気づきました。

The compiler compliance specified is 1.X but a JRE YY is used

ここで「The compiler compliance specified is 1.X」の部分がpom.xmlに記載がある部分です。

以上、ご参考になれば幸いです。


他の記事を読む